【问题标题】:Uint16Array access byteOffset 1, 3, 5 etcUint16Array 访问 byteOffset 1、3、5 等
【发布时间】:2011-12-10 10:08:39
【问题描述】:
new Uint16Array(ArrayBuffer, byteOffset, length);

对于Uint16(word)byteOffset只能是0、2、4、6等,如何获取第2、4字节? (byteOffset = 1、3 等) DataView 是 Chrome 的解决方案,但不是 FireFox 的解决方案(根本不了解歌剧)。

【问题讨论】:

    标签: javascript firefox opera typed-arrays


    【解决方案1】:

    您可以将缓冲区转换为Uint8Array(用于单独的字节),然后从该数组中读取:

    var a = new Uint16Array(10);
    
    // fill `a` with data
    for(var i = 0; i < 10; i++) a[i] = i * 10;
    
    var b = new Uint8Array(a.buffer); // `b` contains bytes of `a`, e.g. use `b[1]`
    

    var orig = new Uint8Array(buffer);
    
    var sub = new Uint16Array(orig.subarray(1, 2)); // from index 1 to 2, so second byte
    
    var word = sub[0]; // 2nd byte as Uint16
    

    关于您发布的案例:

    var buf = new ArrayBuffer(65535);
    var u8s = new Uint8Array(buf);
    u8s[0] = 0x01;
    u8s[1] = 0x02;
    u8s[2] = 0x03;
    var x = new Uint8Array(u8s.subarray(1, 3)).buffer; // buffer from subarray
                                                       // 1 to 3 because 1 word is 2 bytes
    sub = new Uint16Array(x); // create Uint16Array from it
    sub[0]; // 770, which is:   (3 << 8) | 2   (it is big-endian)
    

    【讨论】:

    • @Demion:你可以用b[n]读取a缓冲区的字节,n一些索引。
    • 例如我有 ArrayBuffer,我需要从第二个字节读取到单词(uint16)或短(int16)
    • @Demion:我认为它返回770,因为右边的部分更重要,即0x302。请再次查看我的编辑。
    • var sendbuf = new ArrayBuffer(65535); var buf = new Int8Array(sendbuf, 0, 2); var short = new Int16Array(1);短[0] = -1; var sb = new Int8Array(short); for (var i=0; i
    • @Demion:是的,你应该通过缓冲区,即new Int8Array(short.buffer)。缓冲区包含您需要查看的底层字节。您目前只是将-1 字转换为Int8
    猜你喜欢
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多