[英]Convert floating point byte array to decimal
我在BLE上收到了一个4字节长的数组,我对将最后两个字节转换为C#中的浮点十进制表示形式( float
, double
等)感兴趣。 原始值具有以下格式:
1 sign bit
4 integer bits
11 fractional bits
我的第一次尝试是使用BitConverter
,但是我对该过程感到困惑。
示例:我收到一个byte
数组values
,其中values[2] = 143
和values[3] = 231
。 合并的这2个字节表示上面指定格式的值。 我不确定,但是我认为应该是这样的:
SIGN INT FRACTION
0 0000 00000000000
此外,由于该值以两个字节为单位,因此我尝试使用BitConverter.ToString
来获取十六进制表示形式,然后将这些字节连接起来。 在这一点上,我不确定如何继续。
谢谢您的帮助!
您的问题缺少信息,但是格式似乎很清楚,例如给定的两个字节为
byte[] arr = new byte[] { 123, 45 };
我们有
01111011 00101101
^^ ^^ .. ^
|| || |
|| |11 fractional bits = 01100101101 (813)
||..|
|4 integer bits = 1111 (15)
|
1 sign bit = 0 (positive)
让我们获取所有部分:
bool isNegative = (arr[0] & 0b10000000) != 0;
int intPart = (arr[0] & 0b01111000) >> 3;
int fracPart = ((arr[0] & 0b00000111) << 8) | arr[1];
现在,我们应该将所有这些部分组合成一个数字。 这是模棱两可的 :有许多可能的不同方法来计算小数部分。 其中之一是
result = [sign] * (intPart + fracPart / 2**Number_Of_Frac_Bits)
在我们的案例{ 123, 45 }
中,
sign = 0 (positive)
intPart = 1111b = 15
fracPart = 01100101101b / (2**11) = 813 / 2048 = 0.39697265625
result = 15.39697265625
执行:
// double result = (isNegative ? -1 : 1) * (intPart + fracPart / 2048.0);
Single result = (isNegative ? -1 : 1) * (intPart + fracPart / 2048f);
Console.Write(result);
结果:
15.39697
编辑:如果你居然没有符号位,而是用2的补码的整数部分(这是不寻常 - double
, float
使用符号位 ,2的补数是整数类型,如Int32
, Int16
等),我希望只是一个期望,在上下文中2的补码是不寻常的)
int intPart = (arr[0]) >> 3;
int fracPart = ((arr[0] & 0b00000111) << 8) | arr[1];
if (intPart >= 16)
intPart = -((intPart ^ 0b11111) + 1);
Single result = (intPart + fracPart / 2048f);
您实际上使用固定浮点数的 整数值( Int16
)的另一种可能性; 在这种情况下,转换很容易:
Int16
2048.0
放置固定浮点数 : 码:
// -14.01221 for { 143, 231 }
Single result = unchecked((Int16) ((arr[0] << 8) | arr[1])) / 2048f;
要么
Single result = BitConverter.ToInt16(BitConverter.IsLittleEndian
? arr.Reverse().ToArray()
: arr, 0) / 2048f;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.