假设我有一个字符串
"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
。我该怎么办?