zoukankan      html  css  js  c++  java
  • 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!
  • 相关阅读:
    用confluence完成室项目管理网站的初步搭建
    初中英语单词词库 for supermemo
    用supermemo背单词4年了
    武汉一点印象
    借个iPad玩玩,越狱4.2.1成功
    TIOBE在2011年3月发布的编程语言排名表
    复杂的工作机构,一把手真是不易
    自己做的项目竟然与马拉松石油公司的数字油田思路惊人的相似!
    iPhone开发笔记[1/50]:初学iPhone上用Quartz 2D画图
    背单词的词条终于达到6500
  • 原文地址:https://www.cnblogs.com/blogCblog/p/14171081.html
Copyright © 2011-2022 走看看