当前位置:编程学习 > VB >>

串口收到8位16进制数据,如何将中间4位转换成10进制显示?

--------------------编程问答--------------------
你说的“位”是什么概念?看来不是 bit,是 Byte 吗?
--------------------编程问答-------------------- 哦,怪我没表达清楚,是把中间的4个16进制位转换成10进制。4个16进制位应该是2个Byte。如:FF 01 4A 4A --------------------编程问答--------------------
明明是 4 个 Byte 嘛。

FF 01 4A 4A 是什么格式?就是 Long?大端还是小端?
--------------------编程问答-------------------- “4 个 16 进制位应该是 2 个Byte。”这是对的,但不是你说说的
FF 01 4A 4A
应该是
FF 01
因为 F 就算16进制的一个位了, FF 是16进制的两个位
如果你想说 FF 01 4A 4A 是 4 个位,那也只能是 256 进制的 4 个位,而不是 16 进制的 --------------------编程问答-------------------- 4楼说的有道理。咱先不讨论这个位的问题了,先帮我看看如何转换好吗?我整理半天也没实现。 --------------------编程问答--------------------
Private Sub Command1_Click()
    '"FF 01 4A 4A"
    '长整形
    Print &HFF014A4A
    '整形
    Print &H14A
End Sub
--------------------编程问答-------------------- 哪位大虾指点下,在线等待...... --------------------编程问答-------------------- 其实你的问题应该用二进制位操作的方式就很容易解决。
在C语言里,有二进制位的运算符 << 和 >> ,如果在 C 语言里做这种事很简单,
比如有4个字节数据,然后重高位开始接收,连续收4个字节数据为一个长整形数据,
那么运算顺序可以这样:

   DWORD dwValue = 0;                        // 定义一个4字节的无符号整形变量
   BYTE buff[4] = {0xAA,0xBB,0xCC,0xDD};     // 定义一个4字节的字节数组,并初始化数组内容

   dwValue = (DWORD)(BYTE)buff[0];           // 先将数组最高位赋值到整形变量中
                                             // 这时       dwValue = 0x000000AA
                                             // 二进制情况: 00000000 00000000 00000000 10101010

   for(i=1;i<4;i++){
      dwValue <<= 8;                         // 让整形变量的数值向左偏移8个二进制位
                                             // 这时       dwValue = 0x0000AA00
                                             // 二进制情况: 00000000 00000000 10101010 00000000
      dwValue = dwValue | (DWORD)(BYTE)buff[i];
                                          // 这时       dwValue = 0x0000AABB
                                          // 二进制情况: 00000000 00000000 10101010 10111011
                                          // 其实它们的运算是这样的
                                          // 十六进制(dwValue):0x0000AA00
                                          // 二进制(dwValue):00000000 00000000 10101010 00000000
                                          // 然后用 | 运算符号(等同与 VB 的 or 运算符)与
                                          // buff[i] 做与运算
                                          // 十六进制((DWORD)(BYTE)buff[i]):0x000000BB
                                          // 二进制((DWORD)(BYTE)buff[i]):
                                          // 00000000 00000000 00000000 10111011
                                          // 得到的结果就是
                                          // dwValue = 0x0000AABB
                                          // 二进制:dwValue = 00000000 00000000 10101010 10111011
      // 循环下去就是让 dwValue 的值继续偏移 8 个二进制位,然后通过“或”下一个字节内容,
      // 让数据补齐到二进制低 8 位上,循环完成,dwValue 应该就是 0xAABBCCDD 了。                                      
   }

同样的方法,VB也可以实现,虽然VB里没有 << 运算符,但可以通过运算来解决这种问题。
其实二进制的向左偏移,可以用以下公式实现:
其实 dwValue<<=8; 的正常写法是这样:dwValue = dwValue<<8;
dwValue=dwValue*(2^8) 等同于  dwValue = dwValue<<8;
如果要偏移16个二进制位,可以这样写dwValue=dwValue*(2^16)
如果要向右偏移,可以这样套公式:
dwValue=int(dwValue/(2^8))
如果要向右偏移16个二进制位
dwValue=int(dwValue/(2^16))
以此类推,控制好二进制位就可以很容易处理这种问题了。 --------------------编程问答-------------------- 还有一点,如果是4字节要在 VB 里这样运算,不能使用 long 类型,应为 long 是有符号的整形,
如果运算数值大于long类型的正整数范围,将会出错,因为vb里没有无符号长整形,所以可以用
Currency 类型来满足这种运算需求。
补充:VB ,  基础类
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,