获取图像文件的二进制表示
这个例子的灵感来自这个问题 。
我们假设你知道如何使用 File API 加载文件 。
// preliminary code to handle getting local file and finally printing to console
// the results of our function ArrayBufferToBinary().
var file = // get handle to local file.
var reader = new FileReader();
reader.onload = function(event) {
var data = event.target.result;
console.log(ArrayBufferToBinary(data));
};
reader.readAsArrayBuffer(file); //gets an ArrayBuffer of the file
现在我们使用 DataView
将文件数据实际转换为 1 和 0:
function ArrayBufferToBinary(buffer) {
// Convert an array buffer to a string bit-representation: 0 1 1 0 0 0...
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;
}
DataView
s 让你读/写数字数据; getInt8
将数据从字节位置 - 这里 0
,传入的值 - 在 ArrayBuffer
中转换为带符号的 8 位整数表示,toString(2)
将 8 位整数转换为二进制表示格式(即 1 和 0 的字符串)。
文件保存为字节。 魔术偏移值是通过注意我们将文件存储为字节,即 8 位整数并以 8 位整数表示读取来获得的。如果我们试图将字节保存的(即 8 位)文件读取为 32 位整数,我们会注意到 32/8 = 4 是字节空格的数量,这是我们的字节偏移值。
对于这项任务,DataView
s 是矫枉过正的。它们通常用于遇到数据的字节顺序或异构性的情况(例如,在阅读 PDF 文件时,它们具有以不同基础编码的标题,并且我们希望有意义地提取该值)。因为我们只想要一个文本表示,所以我们不关心异质性,因为根本不需要
使用 UInt8Array
类型数组可以找到更好 - 更短的解决方案,该数组将整个 ArrayBuffer
视为由无符号 8 位整数组成:
function ArrayBufferToBinary(buffer) {
var uint8 = new Uint8Array(buffer);
return uint8.reduce((binary, uint8) => binary + uint8.toString(2), "");
}