簡體   English   中英

大於 0x99 的 Uint8Array 值打印為 0

[英]Uint8Array values above 0x99 are printed as 0

我正在嘗試讀取一個二進制文件並提取其中的一部分以十六進制打印。 我必須從主機讀取文件(使用FileReaderreadAsArrayBuffer )。 我注意到有些東西一直在打印 0,我不知道為什么。

這是重現它的最小方法:

let t = new Uint8Array([ 0x26, 0xa6, 0x01, 0x99 ]);
console.log("T: " + t.map(b => b.toString(16)).join(" "));

輸出:

T: 26 0 1 99

似乎任何超過0x99值都會打印為 0。如果我用數組初始化它,比如
let t = [ 0x26, 0xa6, 0x01, 0x99 ];
那么它的工作原理。

如果我在 Uint8Array 上調用“map”之前調用 Array.from() ,它也可以工作。 任何幫助表示贊賞。

類型化數組上的map創建相同類型的類型化數組。 由於您從回調中返回字符串,因此它們會被轉換為適合數組元素類型的整數,如果無法轉換則為 0。 字符串"a6" (例如)無法隱式轉換,因此您會得到0

使用Array.from的映射工具從可以join在一起的回調創建一個字符串數組:

 let t = new Uint8Array([ 0x26, 0xa6, 0x01, 0x99 ]); console.log("T: " + Array.from(t, b => b.toString(16)).join(" "));


值得注意的是,您在原始代碼的輸出中得到的26具有誤導性。 :-) 那是十進制值 26(而0x26是十進制的38 )。 您傳入0x26 ,它被轉換為"26" ,它被轉換為26 (十進制,而不是十六進制),然后通過join函數轉換回"26"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM