使用
DataView
对象:
function ArrayBufferToBit(buffer) {
var dataView = new DataView(buffer);
var response = "", offset = (8/8);
for(var i = 0; i < dataView.byteLength; i += offset) {
response += dataView.getInt8(i).toString(2);
}
return response;
}
可以读写数字数据,
getInt8
方法将
ArrayBuffer
中从字节位置(这里是0,即传入的值)开始的数据转换为有符号8位整数表示,
toString(2)
方法将8位整数转换为二进制表示格式(即由1和0组成的字符串)。请注意保留HTML标签。
“魔术”偏移值是通过注意到我们正在读取以字节形式存储的文件(即作为8位整数)并以8位整数表示形式读取它来获得的。如果我们试图将以字节保存(即8位)的文件读取为32位整数,则应该注意到32/8 = 4是字节偏移值。
此外,结合使用
DataView
和
typed array
是从
ArrayBuffer
中读写的
推荐方法。您不能直接操作
ArrayBuffer
的内容;相反,您需要创建一个特定格式的
typed array
对象或
DataView
对象来代表缓冲区,并使用它们来读取和写入缓冲区的内容。
除了带符号8位表示,还可以获得各种表示(如
float64
或
int32
)。选择表示形式不应该有影响,因为
toString(2)
将以二进制的方式显示它(尽管出于明显的原因,您的二进制字符串长度肯定会改变!)。
请注意,在此示例中,我选择将整个文件表示为一系列8位整数,即逐字节读取。然而,
DataView
便于混合
同一类型 - 您可以将前12个字节读取为32位整数,其余部分为64位整数,例如。通常情况下,由于可以处理不同的文件格式,并且
DataView
还可以处理来自不同体系结构的文件的字节序问题,因此在处理文件时通常更喜欢使用
DataView
。
像这样的任务可以通过
typed array
或
DataView
来处理 - 但是,
DataView
可以处理字节序(如果从不同CPU的网络传输文件)问题和不同的文件格式(例如PDF文件,在主要内容之前有一些字节头)。
dataView.getInt32(0).toString(2)
对于一张图片给出了结果1000111010010010100011000111000
。看起来有点短... - Jules