【发布时间】:2020-10-10 20:35:58
【问题描述】:
问题陈述:
- 我得到一个文本文件,其中二进制文件的字节数组以逗号分隔的值存储在一行中。
- 例如:82,19,176,106,0,0,0,4,247,35,186,20,87,143,18,120,44,76,100
- 字符串很长,所有内容都在一行中,我无法控制,因为它取决于二进制文件的大小。
- 我必须读取这个字节数组并将其转换回原始二进制文件。
实现的逻辑:
使用 Node.js 和 FS
var instream = fs.createReadStream('stream1.txt',{ highWaterMark: 1 * 1024 , encoding: 'utf8' });
instream.on("data", function(line) {
lineCount++;
var splitArray = line.split(',');
var uintArray = new Uint8Array(splitArray);
chunks.push(uintArray);
console.log(lineCount);
});
instream.on("end", function() {
var fullUint8Array = concatenate(chunks);
fs.writeFile("abc.prt", Buffer.from(fullUint8Array), function (err) {
if (err) {
console.log(err);
} else {
console.log("Done");
}
});
});
- 我无法获取原始二进制文件。它总是被损坏。
- 如果我正在读取单个块中的文件并尝试上述解决方案,它将起作用。但总是无法做到这一点,因为如果尝试将一个非常大的字符串数组转换为 uint8Array 则会出现内存错误。
但是当我分块读取字符串时,我无法获取二进制文件。
我无法理解我做错了什么。使用的技术Node.JS、javascript。
用示例更新了问题
- 这是一个示例流。 (stream1.txt)
- 这是读取stream1.txt后需要输出的原始二进制文件。
- Link to the files
- 连接代码
//For joining uInt8Arrays
function concatenate(arrays) {
let totalLength = 0;
for (const arr of arrays) {
totalLength += arr.length;
}
const result = new Uint8Array(totalLength);
let offset = 0;
for (const arr of arrays) {
result.set(arr, offset);
offset += arr.length;
}
return result;
}
【问题讨论】:
-
concatenate是如何实现的? -
@JózefPodlecki 我将在原始问题中更新的连接代码
标签: javascript node.js arrays