Skip to main content
 首页 » 编程设计

javascript之在javascript中将值转换为bytearray

2025年05月04日22dudu

我正在使用二进制帧编写基于 WebSocket 网络的应用程序。我想将值从 Python 服务器发送到 JS 客户端并返回。

据我所知,打包超过 8 位的值在解包和打包时取决于字节序。 不幸的是,浏览器似乎以小端方式发送所有内容,而网络是大端方式。所以我读到最好的想法是将所有值打包到字节数组中,这样字节序就无关紧要了。

我为 javascript 编写了这个函数:

valueToByteArray: function(value, bytes_length) { 
    var bytes_array = []; 
    for (var i=bytes_length - 1; i>=0; --i) { 
        conjunction_val = 0xFF << i*8; 
        shift = i*8; 
        bytes_array.push((value & conjunction_val) >> shift); 
    } 
    return bytes_array; 
} 

我有测试:

test("Pack value to Byte array", function() { 
    equal( 
        BufferUtility.valueToByteArray(-2000000, 4), 
        [255, 225, 123, 128], 
        "Value packed OK" 
    ); // fail returns [-1, 225, 123, 128], same function in python returns [255L, 225, 123, 128] 
    equal( 
        BufferUtility.valueToByteArray(4000000, 4), 
        [0, 61, 9, 0], 
        "Value packed OK" 
    ); // pass 
    equal( 
        BufferUtility.valueToByteArray(0, 2), 
        [0, 0], 
        "Value packed OK" 
    ); // pass 
    equal( 
        BufferUtility.valueToByteArray(-1, 2), 
        [128, 1], 
        "Value packed OK" 
    ); // fail returns [255, 255] 
}); 

但只有第二次和第三次测试通过,它似乎不适用于带符号的值。 我还在 Python 上检查了这个值,它看起来像 struct.pack('>h', -1) 是 \xFF\xFF。老实说,我不明白。由于 MSb 是符号位,因此 shortint -1 二进制应该是 imo 1000000000000001。

我做错了什么,也许有更好的方法来解决字节序问题?

请您参考如下方法:

我从 Freenode 上的#javascript 获得了这段代码,它的工作令人惊讶,即使它以不同的方式做完全相同的事情:|

function valueToByteArray(value, bytes_length) { 
    var bytes_array = []; 
    while (bytes_length > 0){ 
        var byte = value & 0xFF; 
        value >>= 8; 
        bytes_length--; 
 
        bytes_array.push(byte); 
    } 
    return bytes_array.reverse(); 
} 
 
console.log(valueToByteArray(-2000000, 4)); 
<< [255, 225, 123, 128]