首页 > 解决方案 > 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 

标签: c#ftdi

解决方案


将数据转换为左对齐,以便您的符号位落在您的 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;

推荐阅读