我想将字符串中的char值传递给ArrayBuffer偏移几个字节。所以我写了这个功能就是这么做的。然而我偶然发现了一些奇怪的东西(或者我无法理解)。这两个函数产生完全相同的结果。
function setString(dv, off, str) {
for(var i = 0; i < str.length; i++) {
dv.setUint16(i * 2 + off, str.charCodeAt(i), false);
}
}
function setStringWhy(dv, off, str) {
for(var i = off; i < str.length + off; i++) {
dv.setUint16(i * 2, str.charCodeAt(i - off), true);
}
}
为什么更多地偏移一个字节并使用不同的endiannes导致相同的?
修改
我尝试使用这些功能的片段
var data = new ArrayBuffer(2 + 7*2);
var dv = new DataView(data);
dv.setUint16(0, 0x0010, false);
var color = '#abcdef';
setString(dv, 2, color);
console.log( new Uint8Array( data.slice(2, 7*2 + 2) ));
console.log( new Uint16Array( data.slice(2, 7*2 + 2) ));
console.log( String.fromCharCode.apply( null, new Uint16Array( data.slice(2, 7*2 + 2) )) );
显然产生
Uint8Array [ 0, 35, 0, 97, 0, 98, 0, 99, 0, 100, 0, 101, 0, 102 ]
Uint16Array [ 8960, 24832, 25088, 25344, 25600, 25856, 26112 ]
⌀愀戀挀搀攀昀
如果我错了,请纠正我,但这些Uint16Array值不应该是ex。 0x0035而不是0x3500?
解决方案:
var getString16 = function(dv, beg, end) {
var c = [];
for(var i = beg; i < end; i += 2) {
c.push(dv.getUint16(i, false));
}
return String.fromCharCode.apply(null, c);
}
var setString16 = function(dv, off, str) {
for(var i = 0; i < str.length; i++) {
dv.setUint16(i * 2 + off, str.charCodeAt(i), false);
}
}
// Usage example
var data = new ArrayBuffer(2 + 7*2);
var dv = new DataView(data);
dv.setUint8(0, 0x10, false);
var color = '#abcdef';
setString16(dv, 1, color);