这里是模拟C#转换为字符串从UINT32在Javascript
BitConverter.ToUInt32(Encoding.UTF8.GetBytes(hash.Substring(i, 4)), 0)
有没有办法来归档在Javascript中类似这样的东西吗?
这里是模拟C#转换为字符串从UINT32在Javascript
BitConverter.ToUInt32(Encoding.UTF8.GetBytes(hash.Substring(i, 4)), 0)
有没有办法来归档在Javascript中类似这样的东西吗?
不是直接。简单bitshifts并添加应该做的是:
// 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
值。
我想你可能会想抓住从字符串中的字符的原始代码,在这种情况下,你甚至都不需要担心的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
✇ƒ
*/
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
上大è ndian。 C# BitConverter as well存在同样的不一致性,我认为必须复制。
这里是模拟BitConverter.isLittleEndian
:
function isLittleEndian() {
var v = new Uint16Array(1),
r = new Uint8Array(v);
v[0] = 0xFF00;
return r[0] === 0x00;
}
拉4个字符关的字符串将不一定导致4个字节的。我会质疑为什么你会有4个字节(或一个无符号整数)作为字符串通过UTF-8编码存储在第一位。如果你有字节,并且需要以字符串形式存储,它应该是base-64或hex编码的。 –