使用“特殊”表将2字节转换为十进制

时间:2015-08-31 13:11:59

标签: c#

我有一个需要转换为十进制值的2字节数组(21,121)。我从中读取数字的硬件包括手册中这个方便的小表:

High Low Conversion

问题在于我不确定这个方便的小桌子试图告诉我什么。有人可以帮助解释它并建议一种方法,我可以使用c#将其转换为十进制?

我通常使用BitConverter来转换,但在这种情况下,我得到的值为30977.由于这是一个温度值,我发现很难相信它是那么热......所以我怀疑我经常使用BitConvert是不够的。

4 个答案:

答案 0 :(得分:5)

此表告诉您可以通过这种方式获取值:

public static float GetTemperature(byte[] data, int start = 0)
{
    return (sbyte)data[start] + data[start + 1] / 256.0f;
}

编辑:负数未正确解码。

编辑:正如其他人所提到的,该表显示了该值的编码方式。顶行是二进制数据中的位索引,底行是该位的权重。您所要做的就是将所有位值与它们的权重相乘,然后将它们相加。旁注:第一位不是符号,它表示它是用两个补码编码的。 幸运的是,您不必计算单独的位,因为这几乎是计算机存储所有数据的方式。它就像存储在两个字节上的带符号的短值,缩放为256(2 ** 8)。

BitConverter使用与平台相关的字节顺序,所以基本上你不能在这里使用它。

另一种做到这一点的方法:

public static short GetShort(byte[] data, int start)
{
    return (short)(data[start] * 256 + data[start + 1]);
}

public static float GetTemperature(byte[] data, int start)
{
    return GetShort(data, start) / 256.0f;
}

答案 1 :(得分:1)

该表告诉您低字节值描述0,0039(字节中的第一位)和0,5(字节中的最后一位)之间的值。结合它接近1,高字节的第一位。最高值为128,这是高字节的第六位。第七位告诉您数字是负数还是正数。

因此,这是一个8位有符号整数,具有一些额外的精度。

答案 2 :(得分:1)

结果是21.472 C 该表说第一个字节(21)是" char"并且具有-127 =>的值127。 (2 ^ 6 + 2 ^ 5 + ......) 它看起来像2 ^ 7位是一个标志。这意味着

21 = 21

149 = - 21

149 = 128(0x80)+ 21

第二个数字是一个分数,你可以通过除以256来解析(2 ^ 8)所以121/256 = 21.472

答案 3 :(得分:1)

回答没有参考编程的说法,但手头的问题可以被视为一个简单的数学问题。把它想象成一个新的数字系统,但不是二进制,而第一个“数字”是“值”1,第一个数字值1/2562^-8,下一个数值得双倍。直到排在第16位,如果它是“一个”不合逻辑,则值-2^7而不是2^7

举一个例子,你桌子上的高7是我的“第16位”,值得负2 ^ 7;高4值2 ^ 4,是我的“第13位”,即1/256 * 2 ^ 12。

这有意义吗?

(在编程意义上,byte_high(有符号)+ byte_low(无符号)/ 256f就可以了,签名很重要!)

PS:这使你的(21,121)成21 + 121/256,大约21.47,这似乎是摄氏温度的有效室内温度。