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

Posted

技术标签:

【中文标题】将十六进制数据保存到 NodeJS 中的文件【英文标题】:Saving hex data to file in NodeJS 【发布时间】:2021-07-11 15:33:56 【问题描述】:

假设我有一个字符串

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

【问题讨论】:

你不应该把它变成一个字符串,只需将缓冲区按原样保存到文件中。但是,您不能以您所做的方式“添加到它”,因为您指定将其解码为 utf8 ......这将改变它,因为它不是真正的 utf8。相反,只使用缓冲区,永远不要将它们转换为字符串。 【参考方案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"

【讨论】:

以上是关于将十六进制数据保存到 NodeJS 中的文件的主要内容,如果未能解决你的问题,请参考以下文章

使用十六进制数据读取文件并将其存储到python中的列表中

Python:将十六进制字符串保存到jpg图像文件

十六进制中的精灵表示

在 NODeJS 中的 TCP 套接字上将十六进制字节转换为十进制

将十六进制字符串转换为图像文件[重复]

Documents 文件夹路径中的十六进制部分是啥?