【问题标题】:JS - How map on the bytearray works?JS - bytearray 上的映射如何工作?
【发布时间】:2023-01-18 18:32:24
【问题描述】:

我得到了这样的功能

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 循环重新创建它以帮助我更好地理解它吗?

【问题讨论】:

  • 看起来像是作者甚至没有尝试以任何方式解决的作业。
  • 实际上试图在这里理解基本代码@Touffy

标签: javascript


【解决方案1】:

.map 的结果始终与源的类型相同,因此,当您使用 Buffer.map 时,它创建的对象也将是 Buffer 并且您从回调返回的所有内容都将转换回基础数据类型,即字节。

您也可以观察到类型化数组的相同行为:

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

【讨论】:

    【解决方案2】:

    在您的映射函数中,您收到“字节”(在Buffer 元素的意义上)并返回字符串。

    但是,您应该在此处保留类型。

    改变

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

    return byte & 0xff;
    

    一切都会好起来的。

    如果您在映射期间更改数据类型,则结果是不确定的,实际上取决于实现。在 node.js 运行时中,您会观察到您描述的行为,this substitute 使用您的原始代码生成所需的输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-24
      • 1970-01-01
      • 1970-01-01
      • 2013-04-02
      • 2013-03-24
      • 2023-03-07
      • 1970-01-01
      相关资源
      最近更新 更多