将十六进制数据保存到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"

相关内容

  • 没有找到相关文章

最新更新