11

I need to recode something from js to c# that utilises the btoa method in js on a string of unicode chars to convert them to base64. However, as far as I know the encoding used by javascrpt is different to all those available in c#. I need the encoding to be exactly the same and not return different values across these languages. I have tried setting up a nodejs server and making get requests to it, in order to run the encoding that way, but this is far too slow and unstable. I am under the impression I would need to make my own encoding table but I have no idea where to start or how to implement this. If anyone could help that would be greatly appreciated.

tl;dr: javascript's btoa returns different value than base 64 encoding in c# does. I need it to be the same values.

code and outputs:

c#:
String fromChar = new 
String(247,71,186,8,125,72,2,1.0078125,0.003936767578125);
var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(fromChar);
Console.WriteLine(System.Convert.ToBase64String(plainTextBytes));

output = w7dHwroIfUgCAQA=


javascript:
var x = btoa(String.fromCharCode(247,71,186,8,125,72,2,1.0078125,0.003936767578125);
console.log(x)

output = 
90e6CH1IAgEA

I am aware the former example uses utf8 encoding which js does not, the problem is there is no encoding in .net that matches the javascript encoding.

Edit: Tried to compare the byte arrays of both c# and javascript but the problem is the btoa function uses an unnamed encoding, so I can't actually get the bytes to print the byte array for it without assuming it is something like utf8 which it is not.

8
  • Are you looking for ToBase64 method? Commented Sep 7, 2017 at 9:52
  • You've said "javascript's btoa returns different value than base 64 encoding in c# does". Can you show us the results of encoding in Base64 in both JS and C#. There are multiple different Base64 variants, some using different characters for different values, you may just need to do find/replaces in the output string to change it to the format you want. See en.wikipedia.org/wiki/Base64#Variants_summary_table Commented Sep 7, 2017 at 9:59
  • @AleksAndreev no thta returns a different value. And sure I'll edit the question with an example of it differing. Give me a moment. Commented Sep 7, 2017 at 10:09
  • @NickA done with the outputs Commented Sep 7, 2017 at 10:20
  • You should convert both strings to a bytearray and compare those. It might not be the implementation of the base64 algorithm (actually it's most likely not) and more so a problem of the input. Commented Sep 7, 2017 at 10:33

2 Answers 2

30

Worked it out. For anyone wondering the encoding used is iso encoding. The btoa function in javascript can be replicated by using the following c# method:

public string encoding(string toEncode)
{
byte[] bytes= Encoding.GetEncoding(28591).GetBytes(toEncode);
string toReturn = System.Convert.ToBase64String(bytes);
return toReturn;
}
Sign up to request clarification or add additional context in comments.

1 Comment

How about ATOB() ? ;-)
4

The decoding will be the following:

string base64EncodedString = "6Q==";
Encoding.GetEncoding(28591).GetString(Convert.FromBase64String(base64EncodedString));
// "é"

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.