【问题标题】:ArrayBuffer's Binary clarificationArrayBuffer 的二进制说明
【发布时间】:2015-06-26 07:50:28
【问题描述】:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setInt8

只是想在这里澄清一些事情,当这篇文章说:

setInt8() 方法将一个带符号的 8 位整数(字节)值存储在从 DataView 开始的指定字节偏移处。

然后你执行这段代码

var buffer = new ArrayBuffer(8);
var dataview = new DataView(buffer);
dataview.setInt8(1, 3);
dataview.setInt8(3, -3);

缓冲区实际上是:

[
00000000,
00000011,
00000000,
10000011,
00000000,
00000000,
00000000,
00000000
]

最大可能是127?

我想我已经证实了这一点

dataview.setInt8(1,128);
dataview.getInt8(1); // -127

但是...然后我很困惑为什么它会恢复...

dataview.setInt8(1, 255);
dataview.getInt8(1); // -1

dataview.setInt8(1, 257);
dataview.getInt8(1); // 1

由于256 超出了 8 位整数的范围,我不应该收到 dataview.setInt8(1,257) 的错误吗?我只是想确认缓冲区实际上是我上面列出的二进制数组...所以如果将 8 位整数转换为 16 位整数,这会有所不同...谢谢!

【问题讨论】:

    标签: javascript binary arraybuffer


    【解决方案1】:

    如果你试试这个:

    dataview.setInt8(1,1);
    dataview.getInt16(1); // 256
    dataview.setInt8(1,257);
    dataview.getInt16(1); // 256
    

    您可以确认 setInt8 仅写入缓冲区的一个字节,即使给定的输入值超过 8 位也是如此。所以你在那里很安全。

    奇怪的是.setInt8().setUint8() 似乎具有相同的功能(在我尝试过的唯一浏览器 Chrome 上)。 .setInt8(1,255).setUint8(1,-1) 都不会返回错误,.setInt8(1,-1).setUint8(1,-1) 具有相同的效果。

    此外,您还问过“可能的最高数字是 127?”。是的,如果您使用getInt8() 读取缓冲区。使用getUint8()getInt16() 等读取它可能会返回高于127 的值。与set 函数不同,get 函数似乎(正确地)在签名方面表现不同。

    从一个空缓冲区开始,如果你执行:

    dataview.setInt8(1,3);
    dataview.setInt8(3,3);
    

    缓冲区将包含:

    00000000 00000011 00000000 11111101
    

    您可以通过尝试验证这一点:

    dataview.getInt32(0); // 196861 = 110000000011111101
    

    通过缓冲区中的Two's Complement 表示负数

    【讨论】:

    • 我想出于我的目的,我可以将自己限制为前 255 个值,但你说的是我是正确的,这是来自第一个代码 sn-p 的二进制文件? [ 00000000, 00000011, 00000000, 10000011, 00000000, 00000000, 00000000, 00000000 ]
    • 哎呀!不,实际上。我没有足够仔细地阅读你的数组。正在更新答案。
    • 有趣,是否有一个选项对象可以用来让这些 int 无符号?我真的不需要负数
    • 不要使用getInt8() 来检索值,而是使用getUint8()。无论哪种方式,内部表示都是相同的;阅读方式发生了哪些变化。
    • 其实,如果是补码的话,10000011 实际上是 -127... 如 dataview.setInt8(1,131);会给我那个二进制值吗?这对我有用
    猜你喜欢
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    • 2014-12-18
    • 2014-03-16
    • 2016-06-25
    • 2011-02-15
    相关资源
    最近更新 更多