JS进制转换总结
問題
如:0xf5 轉 十進制, 使用parseInt('f5', 16) 進行轉換,結果為:245。結果沒錯,但不是我想要的結果。
JS 在轉換時,把 0xf5 看作是多字節的,高位字節補 0。完整格式為:0x000000f5 或者 0x0000000000000000f5 (反正比0xf5單字節大) (二進制為 00000000000000000000000011110101), 其轉換為十進制自然是 245。
但是我想要的是把 0xf5 看作是單字節的。格式為:0xf5(二進制為 11110101),其轉換結果為:-11。
解決方法
問題原因就是,js默認把0xf5看作是一個多字節的。那么解決方法就是把0xf5看作是單字節的或者把0xf5看作是多字節有符號的(也就是 0xfffffff5)。
解決辦法有三個:
1:使用Int8Array 包裝一下:
Int8Array 為二進制補碼8位有符號整數的數組,并默認轉成了10進制。取出來即可。
而如果使用Uint8Array:則是無符號的,結果為 245。
2:(不推薦)將高位字節轉換為1,也就是把 00000000000000000000000011110101 改為11111111111111111111111111110101:
直接使用按位或操作:將 0xf5 按位或 0xffffff00:
這種方法是強制將高位字節改為 1。此方法弊端是如果數字較大或較小,或的值就需要跟著變。
3:此種方法跟第二種差不多,但更通用。
此種方法是使用按位與操作:將0xf5 按位與 0xffffffff,但要注意的是,0xf5 與 0xffffffff 的字節必須一樣。也就是把 0xf5 看作是多字節有符號的,修改為 0xfffffff5。
0xfffffff5 與 0xffffffff 操作后還是 0xfffffff5,但他已經是有符號的了。所以結果為有符號的。
總結(進制轉換)
1:有符號轉換
十六進制 轉 十進制:
1 parseInt(new Int8Array(['0xf5'])) // -11
2 new Int8Array(['0xf5'])[0] //-11
3 parseInt('0xffffff' + 'f5' & '0xffffffff') // -11
十進制 轉 十六進制:
1 new Uint8Array(['-11'])[0].toString(16) // f5
2:無符號轉換
十六進制 轉 十進制:
1 parseInt(new Uint8Array(['0xf5'])) //245
2 new Uint8Array(['0xf5']) //245
3 parseInt('0x' + 'f5' & '0xffffffff') //245
4 parseInt('f5', 16) //245
5 parseInt(0xf5) //245
十進制 轉 十六進制:
1 parseInt(245).toString(16) // f5 2 new Uint8Array(['245'])[0].toString(16) //f5
parseInt(0xfffffff5)
在轉換 0xfffffff5時,其結果為 4294967285。
所以js在轉換的時候,把0xfffffff5 看作了一個比4字節還大的數,所以高位為0,結果就為4294967285。
在解決方法的第三點:需要兩者字節一致,就是限制在某個字節下。也可以這樣:0xffffffffffff & 0xfffffffffff5 // -11。
經過測試,最起碼限定在 4字節或以上。
Welcome to my blog!
總結
- 上一篇: 如何用SAP WebIDE的Fiori创
- 下一篇: 乐视超级电视 S85 发布:4K 120