javascript 字节数组上的map是如何工作的?

7gcisfzg  于 2023-01-19  发布在  Java
关注(0)|答案(2)|浏览(118)

我被提供了这样一个功能

function toHexString(bytes) {
    const a =  bytes.map(function (byte) {
        console.log("--------------------")
        const parsedValue = ("00" + (byte & 0xFF).toString(16)).slice(-2)
        console.log(parsedValue)
        console.log(typeof parsedValue)
        console.log("--------------------")
        return ("00" + (byte & 0xFF).toString(16)).slice(-2);
    });
    console.log(a)
}
toHexString(Buffer.from("2241f2", 'hex'))

下面是它的日志响应

--------------------
22
string
--------------------
--------------------
41
string
--------------------
--------------------
f2
string
--------------------

<Buffer 16 29 00>

我真的以为它会在响应中提供给我2241f2,但它没有。你们能给我解释一下为什么吗?
如果可能的话,你能用一个for循环重新创建它来帮助我更好地理解它吗?
我的try using循环

const a = Buffer.from("2241f2", 'hex')
const b= []
for (let byte of a) {
    b.push(("00" + (byte & 0xFF).toString(16)).slice(-2))
}
console.log(b)

结果

[ '22', '41', 'f2' ]
goqiplq2

goqiplq21#

.map的结果总是与源类型相同,因此,当您使用Buffer.map时,它创建的对象也将是Buffer,并且您从回调返回的所有内容都将转换回底层数据类型,即bytes。
您也可以在类型化数组中观察到相同的行为:

const uint8 = new Uint8Array([1, 2, 3]);
const hellos = uint8.map(x => 'hello');
console.log(hellos); // surprise

要从Map器获取一个常规数组,必须专门调用Array.map

const a =  [].map.call(bytes, function (byte) {
   fine to return strings here
})

或者使用循环:

const a = []
for (let byte of bytes)
   a.push(...convert byte to string...)
atmip9wb

atmip9wb2#

在Map函数中,您接收'bytes'(在Buffer元素的意义上)并返回字符串。
但是,您应该保留此处的类型。
变更

return ("00" + (byte & 0xFF).toString(16)).slice(-2);

return byte & 0xff;

一切都会好起来的。
如果你的Map涉及到在Map过程中改变元素的数据类型,那么原则上应该是未定义的--事实上,它取决于实现。在node.js运行时中,你可以观察到你描述的行为,this substitute会用你的原始代码产生想要的输出(使用ethereumjs.Buffer.Buffer代替Buffer)。

相关问题