字符串到ArrayBuffer奇怪的字节序行为

时间:2017-03-02 20:59:44

标签: javascript endianness arraybuffer

我想将字符串中的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);

0 个答案:

没有答案