在NodeJS中将十六进制数据保存到文件

3

假设我有一个字符串

"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。我该怎么办?


1
你不应该将它转换为字符串,只需将缓冲区原样保存到文件中即可。但是,你不能像你所做的那样“添加到它” ,因为你指定了将其解码为utf8...这会改变它,因为它实际上并不是utf8。相反,只使用缓冲区,永远不要将它们转换为字符串。 - CherryDT
1个回答

1
首先,您可以使用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"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接