Buffer转Hex:forEach补零正常,map为何无法补零?
问题原因分析:TypedArray的map方法会强制转换返回值类型
你遇到的问题核心在于**Uint8Array(属于TypedArray)的map方法和普通JavaScript数组的map行为不一样**!
先拆解两个函数的差异:
使用
forEach的版本:
你创建的hex是一个普通数组,forEach里每次push的是字符串类型的十六进制值(比如'01'、'02'),最终数组里全是字符串,join之后自然能得到正确的'0102'。使用
Uint8Array.map的版本:
TypedArray的map方法有个特殊规则:它会把回调函数的返回值强制转换为当前TypedArray对应的数值类型。这里Uint8Array要求每个元素是0-255的整数,而你的回调返回的是字符串(比如'01'),JavaScript会自动把这个字符串转成数值——'01'转成1,'02'转成2,最终得到的还是一个Uint8Array([1,2]),当你调用join('')时,就会把数组里的数字直接拼接成'12'。
解决方法:
只需要把Uint8Array转换成普通数组再使用map即可,有几种常用方式:
方式1:用Array.from转换
export const bufferToHex = (buffer: Buffer): string => { const bytes = new Uint8Array(buffer) return Array.from(bytes) .map((byte) => byte.toString(16).padStart(2, '0')) .join('') }
方式2:用展开运算符转成普通数组
export const bufferToHex = (buffer: Buffer): string => { const bytes = new Uint8Array(buffer) return [...bytes] .map((byte) => byte.toString(16).padStart(2, '0')) .join('') }
这样处理后,map就是普通数组的方法,不会强制转换返回值类型,就能得到带前导零的正确十六进制字符串了。
内容的提问来源于stack exchange,提问作者Mark Robson
相关产品推荐
相关产品推荐

