如: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。
將高位位元組轉換為1,也就是把 00000000000000000000000011110101 改為 11111111111111111111111111110101:
直接使用按位或操作:將 0xf5 按位或 0xffffff00:
這種方法是強制將高位位元組改為 1。此方法弊端是如果數字較大或較小,或的值就需要跟著變。
3:此種方法跟第二種差不多,但更通用。
此種方法是使用按位與操作:將0xf5 按位與 0xffffffff,但要注意的是,0xf5 與 0xffffffff 的位元組必須一樣。也就是把 0xf5 看作是多位元組有符號的,修改為 0xfffffff5。
0xfffffff5 與 0xffffffff 操作後還是 0xfffffff5,但他已經是有符號的了。所以結果為有符號的。
1:有符號轉換
十六進製制 轉 十進位制:
1 parseint(new int8array(['0xf5'])) //十進位制 轉 十六進製制:-112
new int8array(['0xf5'])[0] //
-113 parseint('0xffffff' + 'f5' & '0xffffffff') //
-11
12:無符號轉換new uint8array(['-11'])[0].tostring(16) //
f5
十六進製制 轉 十進位制:
1 parseint(new uint8array(['0xf5'])) //十進位制 轉 十六進製制:2452
new uint8array(['0xf5']) //
2453 parseint('0x' + 'f5' & '0xffffffff') //
2454 parseint('f5', 16)//245
5 parseint(0xf5) //245
1 parseint(245).tostring(16) //f52在轉換 0xfffffff5時,其結果為 4294967285。new uint8array(['245'])[0].tostring(16) //
f5
所以js在轉換的時候,把0xfffffff5 看作了乙個比4位元組還大的數,所以高位為0,結果就為 4294967285。
在解決方法的第三點:需要兩者位元組一致,就是限制在某個位元組下。也可以這樣:0xffffffffffff & 0xfffffffffff5 // -11。
經過測試,最起碼限定在 4位元組或以上。
JS 進製轉換
js中的進製轉換主要運用兩個函式即 tostring 方法 返回物件的字串表示。objectname.tostring radix 引數 objectname 必選項。要得到字串表示的物件。radix 可選項。指定將數字值轉換為字串時的進製。說明 tostring方法是所有內建的 jscript 物...
js 進製轉換
十進位制轉其他進製 const x 110 log x.tostring 2 log x.tostring 8 log x.tostring 16 其他進製轉十進位制 const x 110 log parseint x,2 log parseint x,8 log parseint x,16 其他...
js 進製轉換
js的進製轉換,分為2進製,8進製,10進製,16進製制之間的相互轉換,我們直接利用 物件.tostring 即可實現 執行下面 10進製轉為16進製制 10 tostring 16 a 8進製轉為16進製制 012 tostring 16 a 16進製制轉為10進製 0x16 tostring 1...