进制转换采坑.md 2.2 KB

javaScript中进制转换

1. 前言

  1. 问题描述   在某次使用js操作innfos机器人时,使用udp进行连接后需要发送机械臂位置实现位置控制,innfos使用16进制编码进行通信.数据需要转换为32位进行发送。   初始方案使用js自带的函数进行类型转换,将计算结果直接进行toString操作,传入参数16告诉转换为16进制值,直接使用toString函数转换成的hex进制字符串会出现一些问题.印象比较深刻的问题是转换数值小于16的值时会出现首字为0情况下自动忽略0. 需要手动在前方进行添加 0

    // 比如要转换的值为15时,会返回F 但是进行通信需要的数据为 0F 
    (15).toString(16);// F
    
    

  该方法转换正整数时可以正常工作,但是转换负整数时无法正常工作.当时排查了很久,后面发现是该方法转换负整数时转换为了有符号数,会在数据前方添加一个负数符号即-。当时想的是直接移除负号,但是效果根本不行,移除负号就是正数了。当时找了许久。并没有直接找到方案

//比如 -987654 转换为16进制 "-f1206"
(-987654).toString(16)//> "-f1206"
  1. 解决思路   首先得清楚为什么会这样,在js中使用的是有32位符号数,当时我用win计算器应该是64位的,找出了一些规律.但是我要通信的对象使用的是32位无符号数,尝试使用win的计算器生成的16进制值发送是可行的.于是问题变为了在js中如何生成32位无符号16进制数了. > [!tip] > 此处需要了解一下 计算机补码@张子秋 ,从搜索引擎直接搜索的看着有点蒙逼,这个博文的看着要稍微舒服一点. 字体清晰一点

  根据我的粗俗理解,缝合一下理论就是,无符号数将会在数据前面用一位来专门表示正数还是负数.所以n位的无符号数能表示的最大正整数值y为 $y=2^n/2-1$ 根据该公式发现无符号数的最大值只有位数的一半还要少1。有一半空间用来存储负整数。