我使用Node JS和Express.js在我的Web服务器上工作。我需要在缓冲区中插入十六进制值,从二进制字符串开始。我的代码是这样的:
var buffer = fs.readFileSync("myBINfile.dat");
setValue(buffer, 4);
function setValue(buffer, i) {
var value1 = parseInt(buffer[i].toString(16), 16).toString(2).toString()
value1 = "0" + value1.substring(1, value1.length);
var hex = parseInt(value1, 2).toString(16);
console.log(hex); // print a8 (correct)
buffer[i] = hex;
console.log(buffer[i]); // print 0 (why?)
}
缓冲区包含一个十六进制文件。value1
读取正确。怎样才能解决这个问题?由于
您正在将字符串值写入Buffer
对象,而不是它期望的数值。替换行:
var hex = parseInt(value1, 2).toString(16);
:
var hex = parseInt(value1, 2);
"a8"
实际上只是整数值168(你会发现,如果你在var hex = parseInt(value1, 2).toString(16);
行之前输入console.log(value1)
,你会得到10101000
(二进制的168))。当你将这个值写入缓冲区时,你实际上只是想写入整数值,而不是字符串"a8"
。
十六进制值"正如你所说,十六进制实际上只是一个数字,只是一种表示格式。你不存储"十六进制数字"或者"二进制数",只存储数字本身。
这样做的结果是,您会发现console.log(hex);
输出168,并认为"这是错误的!",但事实并非如此,因为168是a8。
你会发现它适用于某些值而不是其他值的原因是因为任何导致纯数值十六进制值的值(例如"22"
或"67"
)将自动转换为它们的数值等效(22
或67
)。在你的例子中,"a8"
的值不能转换为缓冲区所需的数字类型,因此被丢弃,0
被写入。