16

is there any C# method that works similar to Convert.ToBase64String but doesn't generate anything except alphanumeric output?

Thanks!

Alex
  • 75,813
  • 86
  • 255
  • 348
  • 6
    So you're really after base 62 encoding? – Smashery Jun 01 '09 at 04:05
  • Can you tell us your specific reason for not wanting the plus or slash from Base64, just out of interest? – Xiaofu Jun 01 '09 at 04:13
  • I'm using the encoded string in a URL afterwards, and the random slashes are messing with my URL routing, while the + is disallowed by my IIS7 settings (the one where you can double encode with +, forgot the name). – Alex Jun 01 '09 at 04:17
  • base 62 encoding - yes, please! (See @AFract answer below) – pettys Apr 02 '21 at 19:39

6 Answers6

24

The answers are a bit outdated now. For the benefit of future searchers: The best way to handle this now in C# is:

byte[] b; // fill your byte array somehow
string s = System.Web.HttpServerUtility.UrlTokenEncode(b);

This returns a Base64-encoded string that is URL-safe (which is what you said you were really after in the comments to your question).

You can then decode it again using, you guessed it:

byte[] b = System.Web.HttpServerUtility.UrlTokenDecode(s);
Mason G. Zhwiti
  • 6,444
  • 11
  • 61
  • 97
14

You're probably looking at using something like Base32 encoding then. There is a Base32 encoder/decoder for C# here by Michael Giagnocavo. It uses a combination of capitalized letters and numbers.

There's also a related discussion on StackOverflow here.

EDIT: And if by any chance this is for URL-safe related Base64 encoding, just do Base64 and replace "+" with "-" and "/" with "_". But I'm guessing, you may not want it for that.

Community
  • 1
  • 1
Xiaofu
  • 15,523
  • 2
  • 32
  • 45
3

A common variant of base-64 (for use on query-string) is to use '-' and '_' in place of '+' and '/'. Perhaps a bit of Replace(...) at each end would do the job?

Marc Gravell
  • 1,026,079
  • 266
  • 2,566
  • 2,900
2

you can replace + or slash with some predefined string if possible.

TheVillageIdiot
  • 40,053
  • 20
  • 133
  • 188
  • 1
    I thought about doing that, but if I happen to hit that exact string during regular base64 encoding then hell breaks loose. Plus it would be really just a hack. :( – Alex Jun 01 '09 at 04:09
  • @Alex it is not a hack. It is used in communications. I really not remember the exact scheme (that's why such short answer) but it is possible to handle the occurrence of pattern in base64 string gracefully. I've read about it in AST's "Computer Network" and Stalling's "Data and Computer Communications" during my masters. – TheVillageIdiot Jun 01 '09 at 04:25
  • Got it. Didn't know about "-" and "_" by the way - that works I guess. Thanks so much though! :) – Alex Jun 01 '09 at 04:29
1

I was searching for a such like encoder and I used https://github.com/renmengye/base62-csharp/

It's an encoder/decoder in "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" character space range.

I just wrapped its methods with

System.Text.Encoding.UTF8.GetBytes(plainText); and System.Text.Encoding.UTF8.GetString(decoded);

calls to allow it to work easily with strings.

AFract
  • 8,868
  • 6
  • 48
  • 70
  • 1
    Yes! This is what I'm looking for. Not for URL's, though - just representing a string of bytes in an easy copy/pasteable way. – pettys Apr 02 '21 at 19:38
0

You can use BitConverter.ToString() which will give you a hex string. However the resulting strings will be longer than Base64 encoding.

sharptooth
  • 167,383
  • 100
  • 513
  • 979