【发布时间】:2019-08-16 18:51:01
【问题描述】:
我有下面的 .NET 代码通过首先将字符串转换为字节数组来将字符串转换为 Base64 编码。我在 Stack Overflow 上尝试了不同的答案来转换字节数组中的字符串,然后使用 btoa() 函数在 JavaScript 中进行 base64 编码。但是,我没有得到下面共享的确切编码值。
对于字符串值,
BBFDC43D-4890-4558-BB89-50D802014A97
我需要Base64编码,
PcT9u5BIWEW7iVDYAgFKlw==
.NET 代码:
String str = "BBFDC43D-4890-4558-BB89-50D802014A97"
Guid guid = new Guid(str);
Console.WriteLine(guid); // bbfdc43d-4890-4558-bb89-50d802014a97
Byte[] bytes = guid.ToByteArray();
Console.WriteLine(bytes); // System.Byte[]
String s = Convert.ToBase64String(bytes, Base64FormattingOptions.InsertLineBreaks);
Console.WriteLine(s); // PcT9u5BIWEW7iVDYAgFKlw==
目前,我尝试使用以下代码,但没有产生预期的结果:
function strToUtf8Bytes(str) {
const utf8 = [];
for (let ii = 0; ii < str.length; ii++) {
let charCode = str.charCodeAt(ii);
if (charCode < 0x80) utf8.push(charCode);
else if (charCode < 0x800) {
utf8.push(0xc0 | (charCode >> 6), 0x80 | (charCode & 0x3f));
} else if (charCode < 0xd800 || charCode >= 0xe000) {
utf8.push(0xe0 | (charCode >> 12), 0x80 | ((charCode >> 6) & 0x3f), 0x80 | (charCode & 0x3f));
} else {
ii++;
// Surrogate pair:
// UTF-16 encodes 0x10000-0x10FFFF by subtracting 0x10000 and
// splitting the 20 bits of 0x0-0xFFFFF into two halves
charCode = 0x10000 + (((charCode & 0x3ff) << 10) | (str.charCodeAt(ii) & 0x3ff));
utf8.push(
0xf0 | (charCode >> 18),
0x80 | ((charCode >> 12) & 0x3f),
0x80 | ((charCode >> 6) & 0x3f),
0x80 | (charCode & 0x3f),
);
}
}
return utf8;
}
const str = "BBFDC43D-4890-4558-BB89-50D802014A97";
const strByteArr = strToUtf8Bytes(str);
const strBase64 = btoa(strByteArr);
// NjYsNjYsNzAsNjgsNjcsNTIsNTEsNjgsNDUsNTIsNTYsNTcsNDgsNDUsNTIsNTMsNTMsNTYsNDUsNjYsNjYsNTYsNTcsNDUsNTMsNDgsNjgsNTYsNDgsNTAsNDgsNDksNTIsNjUsNTcsNTU=
【问题讨论】:
-
能否也提供你使用的JS代码?
-
这不是那个问题的重复,因为我正在使用 btoa() 进行编码,但我担心这里的字节数组。
-
您确定 PcT9u5BIWEW7iVDYAgFKlw== 是字符串 BBFDC43D-4890-4558-BB89-50D802014A97 的 base64 表示形式
-
您应该发布您的 javascript 代码。同样,正如我之前所说,您的代码不会将该字符串转换为 base64,而是将该字符串作为一组十六进制值,将其转换为以 10 为基数,然后将生成的字节数组编码为以 64 为基数
标签: javascript c# arrays .net encoding