-1

我正在使用一个向我发送十六进制值的设备,我需要将这些值转换为他的真实浮点值。在这里你可以看到转换表:

01 1111 1111 1111  --> 1.99975g
01 1111 1111 1110  --> 1.99950g
...
...
00 0000 0000 0001  --> 0.00025g
00 0000 0000 0000  --> 0.00000g
11 1111 1111 1111  --> -0.00025g
...
...
10 0000 0000 0001  --> -1.99975g
10 0000 0000 0000  --> -2.00000g

我做了一个 LookUpTable 来解决我的问题,但我只是想知道在 MatLab 中是否有更好的方法。

谢谢你的帮助。

4

3 回答 3

1

如果您的二进制表示形式存储为变量中的字符串b,这将打印您要查找的内容:

integer_part = bin2dec(b(2));
fraction_part = bin2dec(b(4:end)) * 2^-12;

value = integer_part + fraction_part;

if b(1) == '1'
    value = -2 + value;
end

disp(value)
于 2012-06-10T20:51:18.650 回答
0

如果没有关于使用的二进制表示的更多信息,这是我能得到的最接近的值:

%# values stored as strings
b = [ ...
  '01111111111111'
  '01111111111110'
  '00000000000001'
  '00000000000000'
  '11111111111111'
  '10000000000001'
  '10000000000000'
];

%# convert to numbers
val = sum(bsxfun(@times, b-'0', [-2 0.5.^(0:size(b,2)-2)]), 2);

结果:

>> fprintf('%.5f\n', val)
1.99976
1.99951
0.00024
0.00000
-0.00024
-1.99976
-2.00000
于 2012-06-10T22:45:03.967 回答
0

我认为@zellus 是对的。这是对 2 的恭维的一种变体。它使用 14 位的“字节”大小,然后在转换为整数(称为索引)后乘以 2/8192 的比例因子。这会将索引值 8192 映射到 2g。像@Amro 一样,这种方法有小的舍入误差,但我希望它能更好地向您展示正在发生的事情(它可能在计算上也更快,我无法测试它,因为我没有 MATLAB 许可证)

步骤是

  1. 如果传入号码有标记 1,则该号码为负数。否则,它是积极的。无论如何放弃哨兵号码。
  2. 将二进制数转换为整数
  3. 如果整数为负数,则减 1
  4. 将整数乘以比例因子 2/8192。

将此应用于您的数据会产生

INCOMING      PROCESS SENTINEL       RAW     INDEX       SCALED
01 1111 1111 1111 --> +1 1111 1111 1111 --> +8191 -->  8191 -->  1.99976g
01 1111 1111 1110 --> +1 1111 1111 1110 --> +8190 -->  8190 -->  1.99951g
...
00 0000 0000 0001 --> +0 0000 0000 0001 -->    +1 -->     1 -->  0.00024g
00 0000 0000 0000 --> +0 0000 0000 0000 -->    +0 -->     0 -->  0.00000g
11 1111 1111 1111 --> -0 0000 0000 0000 -->    -0 -->    -1 --> -0.00024g
...
10 0000 0000 0001 --> -1 1111 1111 1110 --> -8190 --> -8191 --> -1.99976g
10 0000 0000 0000 --> -1 1111 1111 1111 --> -8191 --> -8192 --> -2.00000g

仅从外观上看,自然比例因子似乎是 0.00025。01 1111 1111 1111 是否有可能应该是 2.04775g?

我假设您正在尝试与 2G 到 -2G 规模的加速器(或其他设备)交互。如果文档说 2G 到 -2G,他们可能已经将 2.04775G 到 -2.05G 的真正全范围四舍五入。

如果您不熟悉它,请查找两个赞美。这是很酷的东西。二进制数实际上将自己添加到其中。

编辑:我在第一步中遗漏了一个很大的地方。如果第一位是一个,您还需要不是每个位。

于 2012-06-11T07:01:40.573 回答