Buffer.from处理小于16的十进制数生成空缓冲区的解决方法
问题:Buffer.from处理小于16的十进制数时生成空缓冲区
当使用Buffer.from传入小于16的十进制数转换的十六进制字符串时,会创建空缓冲区。示例代码如下:
let num01 = Buffer.from(Number(1).toString(16), "hex"); console.log(num01); let num02 = Buffer.from("02", "hex"); console.log(num02); let num16 = Buffer.from(Number(16).toString(16), "hex"); console.log(num16);
执行后输出:
<Buffer > // 期望输出为0x01? <Buffer 02> <Buffer 10>
可以看到,输入小于16的十进制数时,第一行代码无法生成含有效值的缓冲区,而带前导零的十六进制字符串(如"02")则能正常工作。请问如何修改第一行代码,使其可接收小于16的十进制数并生成合适的Buffer?
解决方案
方法1:补全十六进制字符串为两位长度
问题根源在于Buffer.from的hex编码要求输入字符串长度为偶数——每两个十六进制字符对应一个字节。小于16的十进制数转十六进制后是单个字符(比如1转成"1"),不符合格式要求,因此被忽略生成空缓冲区。
只需在转换后的十六进制字符串前补零,确保长度为2即可:
let num01 = Buffer.from(Number(1).toString(16).padStart(2, '0'), "hex"); console.log(num01); // <Buffer 01> let num02 = Buffer.from("02", "hex"); console.log(num02); // <Buffer 02> let num16 = Buffer.from(Number(16).toString(16).padStart(2, '0'), "hex"); console.log(num16); // <Buffer 10>
方法2:直接分配Buffer并赋值(更高效)
如果不需要字符串转换的步骤,直接创建一个长度为1的Buffer并赋值是更直接高效的方式:
let num01 = Buffer.alloc(1); num01[0] = 1; console.log(num01); // <Buffer 01>
这种方法跳过了字符串转换,避免了格式匹配的问题,性能更优。
内容的提问来源于stack exchange,提问作者miran80
相关产品推荐
相关产品推荐

