c# - c# FTDI 24bit 二进制补码工具
问题描述
我是 C# 的初学者,想要一些关于如何解决以下问题的建议:
我的代码从 ADC 真正的 FTDI ic 读取 3 个字节并计算值。问题是有时我得到的值低于零(小于 0000 0000 0000 0000 0000 0000)并且我的计算值跳到一个很大的数字。我需要实现二进制补码,但我和我不知道如何。
byte[] readData1 = new byte[3];
ftStatus = myFtdiDevice.Read(readData1, numBytesAvailable, ref numBytesRead); //read data from FTDI
int vrednost1 = (readData1[2] << 16) | (readData1[1] << 8) | (readData1[0]); //convert LSB MSB
int v = ((((4.096 / 16777216) * vrednost1) / 4) * 250); //calculate
解决方案
将数据转换为左对齐,以便您的符号位落在您的 PC 处理器视为符号位的位置。然后右移回来,这将自动执行符号扩展。
int left_justified = (readData[2] << 24) | (readData[1] << 16) | (readData[0] << 8);
int result = left_justified >> 8;
等效地,可以将包含符号位的字节标记为有符号,因此处理器将执行符号扩展:
int result = (unchecked((sbyte)readData[2]) << 16) | (readData[1] << 8) | readData[0];
第二种方法只有在符号位已经在任何一个字节内左对齐时才有效。左对齐方法适用于任意大小,例如 18 位二进制补码读数。在这种情况下,演员sbyte
不会做这项工作。
int left_justified18 = (readData[2] << 30) | (readData[1] << 22) | (readData[0] << 14);
int result18 = left_justified >> 14;
推荐阅读
- swift - NSPredicate 一对多关系查询示例
- vue.js - Nuxt Js 事件触发两次
- python - 将连续整数列表的每个可能子集中的整数相乘
- mysql - Mysql查找替换查询-转义格式
- excel - 不使用 excel 和 IBM 3270 终端结束
- python-3.x - 如何用numpy中另一个ndarray的每个元素减去ndarray中的每个元素
- html - HTML/CSS嵌套左边框:重复视觉效果
- html - 我可以使用边距属性使身体居中吗?
- r - R Shiny VIM 包 aggr
- javascript - 无法使用 javaScript 打印 HTML 中的特定字符串