串口收到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 , 基础类