繁体   English   中英

将浮点字节数组转换为十进制

[英]Convert floating point byte array to decimal

我在BLE上收到了一个4字节长的数组,我对将最后两个字节转换为C#中的浮点十进制表示形式( floatdouble等)感兴趣。 原始值具有以下格式:

 1 sign bit 
 4 integer bits 
11 fractional bits

我的第一次尝试是使用BitConverter ,但是我对该过程感到困惑。

示例:我收到一个byte数组values ,其中values[2] = 143values[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的补码的整数部分(这是不寻常 - doublefloat使用符号位 ,2的补数是整数类型,如Int32Int16等),我希望只是一个期望,在上下文中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 )的另一种可能性; 在这种情况下,转换很容易:

  1. 我们照常获取Int16
  2. 然后通过除以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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM