从Javascript中的字符串转换为uint32

本文关键字:转换 uint32 字符串 Javascript | 更新日期: 2023-09-27 18:21:08

这是模拟C#

BitConverter.ToUInt32(Encoding.UTF8.GetBytes(hash.Substring(i, 4)), 0)

有没有一种方法可以在Javascript中归档类似的东西?

从Javascript中的字符串转换为uint32

我认为您可能想要从字符串中获取原始字符代码,在这种情况下,您甚至不需要担心unicode问题,请记住javascript每个字符使用两个字节:

var str="✇ƒ";
var br=str.slice(0,2).split("")
       .map(function(a){return ("00000000000000000"+a.charCodeAt().toString(2))
       .slice(-16); })
var lng=parseInt(br.join(""),2);
var andBack = ( "00000000000000000" + lng.toString(2))
  .slice(-32)
  .split(/^('w{16})/)
  .filter(Boolean)
  .map(function(a){return String.fromCharCode(parseInt(a,2))})
  .join("");

alert([str, br, lng, andBack].join("'n"))
/* shows:
✇ƒ 
0010011100000111,0000000110010010
654770578
✇ƒ     
*/

不直接。简单的比特移位和加法应该做到这一点:

// data[] contains 4 bytes representing an unsigned integer
// make sure to adjust for endiannes (may need to flip order of indexes)
var result = (data[0]<<24) + (data[1] << 16) + (data[2] << 8) + (data[3]);

请注意,在大多数JavaScript实现中,没有足够的精度来正确保存所有UIint64/Int64值。

类似的简单行

var my_int = +(value);

通常应该这样做,除了ceck-out-parseint。

function utf8encode( str ) {
    var encoded = unescape(encodeURIComponent(str)),
        ret = new Uint8Array(encoded.length);
    for( var i = 0, len = encoded.length; i < len; ++i ) {
        ret[i] = encoded.charCodeAt(i);
    }
    return ret;    
}
var uint32 = new Uint32Array(utf8encode(hash.substring(i, 4)).buffer)[0];

例如:

var hash = "aosdasokda", i = 0;

uint32在小端序机器上将是1685286753,在大端序机器中将是1634693988。同样的不一致性也出现在C#BitConverter上,我认为必须复制。

这里类似于BitConverter.isLittleEndian:

function isLittleEndian() {
    var v = new Uint16Array(1),
        r = new Uint8Array(v);
    v[0] = 0xFF00;
    return r[0] === 0x00;
}