2025年12月29日 星期一

再探 Uint8Array.fromHex()

 再探 Uint8Array.fromHex()

前言

  在先前的 初探 Uint8Array.fromHex() 與 Uint8Array.toHex() 使用 Uint8Array.fromHex() 來編碼成 Hex ,Uint8Array.fromHex() 是如何編碼儲存的呢?在此把學習的過程做個紀錄。


內容

  在開始前先說明一下 初探 Uint8Array.fromHex() 與 Uint8Array.toHex() 會容易讓人以為可以將任何字串做編碼,但事實上只有符合 16 進制的字元( 0 ~ 9 與 a~f ) 可以被編碼,如果該字串含有非 16 進制的字元( 0 ~ 9 與 a~f ) 將會報錯。範例如下

let str = '0123456789abcdef';
let arHex = Uint8Array.fromHex( str);
console.log( arHex.toString() );//1,35,69,103,137,171,205,239
arHex.forEach( (val) => console.log( "0x"+val.toString(16).padStart(2,'0') ) );
// "0x01"
// "0x23"
// "0x45"
// "0x67"
// "0x89"
// "0xab"
// "0xcd"
// "0xef"


透過 Uint8Array.toString() 可以看到儲存的時候只有 8 個,但輸入的字串有 16 個,所以猜測是以每兩個 Byte 編碼成一個 Uint8 ,結果呢?沒錯,透過範例最後的 forEach() 可以看到每個 Uint8 編碼是來自兩個 Byte ,第一個 ox01 是來自原始字串的 o1 ,注意高位元是 0 ,低位元是 1 ,所以編碼成 0x01 ,而非0x10 。

 

參考資料

[ developer.mozilla.org ] Uint8Array.fromHex()


相關文章與資料

初探 Uint8Array.fromHex() 與 Uint8Array.toHex()

沒有留言:

張貼留言