为了账号安全,请及时绑定邮箱和手机立即绑定

如何将字符串转换为Bytearray

/ 猿问

如何将字符串转换为Bytearray

噜噜哒 2019-11-15 13:02:42

如何使用JavaScript转换字节数组中的字符串。输出应等效于以下C#代码。


UnicodeEncoding encoding = new UnicodeEncoding();

byte[] bytes = encoding.GetBytes(AnyString);

由于UnicodeEncoding默认为具有Little-Endianness的UTF-16。


编辑:我需要使用上面的C#代码将字节数组生成的客户端与服务器端生成的字节数组进行匹配。


查看完整描述

3 回答

?
慕函数4003404

在C#中运行


UnicodeEncoding encoding = new UnicodeEncoding();

byte[] bytes = encoding.GetBytes("Hello");

将创建一个数组


72,0,101,0,108,0,108,0,111,0

字节数组


对于代码大于255的字符,它将如下所示


字节数组


如果您想在JavaScript中实现非常相似的行为,则可以执行此操作(v2是更强大的解决方案,而原始版本仅适用于0x00〜0xff)


var str = "Hello竜";

var bytes = []; // char codes

var bytesv2 = []; // char codes


for (var i = 0; i < str.length; ++i) {

  var code = str.charCodeAt(i);

  

  bytes = bytes.concat([code]);

  

  bytesv2 = bytesv2.concat([code & 0xff, code / 256 >>> 0]);

}


// 72, 101, 108, 108, 111, 31452

console.log('bytes', bytes.join(', '));


// 72, 0, 101, 0, 108, 0, 108, 0, 111, 0, 220, 122

console.log('bytesv2', bytesv2.join(', '));


查看完整回答
反对 回复 2019-11-15
?
冉冉说

如果您正在寻找可以在node.js中使用的解决方案,则可以使用以下方法:


var myBuffer = [];

var str = 'Stack Overflow';

var buffer = new Buffer(str, 'utf16le');

for (var i = 0; i < buffer.length; i++) {

    myBuffer.push(buffer[i]);

}


console.log(myBuffer);


查看完整回答
反对 回复 2019-11-15
?
桃花长相依

我想C#和Java产生相等的字节数组。如果您使用非ASCII字符,则仅添加一个0是不够的。我的示例包含一些特殊字符:


var str = "Hell ö € Ω 𝄞";

var bytes = [];

var charCode;


for (var i = 0; i < str.length; ++i)

{

    charCode = str.charCodeAt(i);

    bytes.push((charCode & 0xFF00) >> 8);

    bytes.push(charCode & 0xFF);

}


alert(bytes.join(' '));

// 0 72 0 101 0 108 0 108 0 32 0 246 0 32 32 172 0 32 3 169 0 32 216 52 221 30

我不知道C#是否放置BOM(字节顺序标记),但是如果使用UTF-16,Java String.getBytes将添加以下字节:254 255。


String s = "Hell ö € Ω ";

// now add a character outside the BMP (Basic Multilingual Plane)

// we take the violin-symbol (U+1D11E) MUSICAL SYMBOL G CLEF

s += new String(Character.toChars(0x1D11E));

// surrogate codepoints are: d834, dd1e, so one could also write "\ud834\udd1e"


byte[] bytes = s.getBytes("UTF-16");

for (byte aByte : bytes) {

    System.out.print((0xFF & aByte) + " ");

}

// 254 255 0 72 0 101 0 108 0 108 0 32 0 246 0 32 32 172 0 32 3 169 0 32 216 52 221 30

编辑:


添加了特殊字符(U + 1D11E)MUSICAL SYMBOL G CLEF(BPM之外),因此在UTF-16中不仅占用2个字节,而且占用4个字节。


当前的JavaScript版本内部使用“ UCS-2”,因此此符号使用2个普通字符的空格。


我不确定,但是使用charCodeAt它时,我们似乎可以准确地获得UTF-16中也使用的替代代码点,因此可以正确处理非BPM字符。


这个问题绝对是不容易的。它可能取决于所使用的JavaScript版本和引擎。因此,如果您需要可靠的解决方案,则应该看看:


https://github.com/koichik/node-codepoint/

http://mathiasbynens.be/notes/javascript-escapes

查看完整回答
反对 回复 2019-11-15

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信