如何解决将十六进制数据保存到 NodeJS 中的文件
说我有一个字符串
"020000009B020000C0060000"
我想把它变成一个字符串,这样如果它被保存为一个文件并在十六进制编辑器中打开它会显示与我输入的相同的十六进制。 我该怎么做呢? 我从来不需要使用缓冲区或任何东西,但在尝试这样做时,我似乎不得不这样做,而且我真的不知道我在做什么。
(或者我是否应该使用缓冲区 - 我已经搜索了几个小时,我能找到的只是使用缓冲区的答案,所以我只是拿了他们的例子,但没有任何效果)
我把十六进制字符串变成了缓冲区
function hexToBuffer(hex) {
let typedArray = new Uint8Array(hex.match(/[\da-f]{2}/gi).map(function (h) {
return parseInt(h,16)
}))
return typedArray
}
这似乎有效,因为记录 hexToBuffer("020000009B020000C0060000").buffer
它返回的内容给了我这个:
ArrayBuffer {
[Uint8Contents]: <02 00 00 00 9b 02 00 00 c0 06 00 00>,byteLength: 12
}
与我输入的十六进制相同,所以它似乎工作正常, 然后将数组缓冲区变成一个字符串,我这样做了。
let dataView = new DataView(buffer);
let decoder = new TextDecoder('utf-8');
let string = decoder.decode(dataView)
为了测试它是否有效,我将其保存到一个文件中。
fs.writeFileSync(__dirname+'/test.txt',string)
在十六进制编辑器中打开 test.txt 显示不同的数据:
02000000EFBFBD020000EFBFBD060000
如果我改为这样做
fs.writeFileSync(__dirname+'/test.txt',hexToBuffer("020000009B020000C0060000"))
然后我得到了正确的数据 - 但是如果我用 fs 读取文件然后添加到它,它再次不是相同的值。
let test = fs.readFileSync(__dirname+'/test.txt','utf8)
let example2 = test+'example'
fs.writeFileSync(__dirname+'/test.txt',example2)
现在 test.txt 以 02000000EFBFBD020000EFBFBD060000
开头,而不是 020000009B020000C0060000
。我该怎么办?
解决方法
首先,您可以使用 Buffer.from(string[,encoding])
方法从字符串创建缓冲区,同时还指定编码 - 在您的情况下,它将是 "hex"
:
const b1 = Buffer.from("020000009B020000C0060000","hex")
现在将其保存到文件中:
fs.writeFileSync(path.resolve('./test'),b1)
然后我们可以通过在命令行上使用 xxd
来检查文件是否包含与字符串中相同的十六进制值:
$ xxd test
0200 0000 9b02 0000 c006 0000
看起来不错!
现在我们也可以将文件读回缓冲区,确保再次告诉它文件的编码是"hex"
:
const b2 = fs.readFileSync(path.resolve("./test"),"hex")
最后,使用 Buffer.toString() 方法再次将其转回字符串:
console.log(b2.toString()) // => "020000009b020000c0060000"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。