在MatLab中从十六进制转换为浮点数

时间:2012-06-10 16:42:23

标签: matlab binary numbers

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

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中做到这一点。

感谢您的帮助。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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

答案 2 :(得分:0)

我认为@zellus是对的。这是对2的恭维的变化。它使用14位的“字节”大小,然后在转换为整数(称为索引)后,乘以比例因子2/8192。这将索引值8192映射到2g。就像@Amro一样,这种方法有很小的舍入误差但是我希望它能告诉你什么情况好一点(可能计算速度更快,我无法测试它因为我不喜欢有一个MATLAB许可证)

步骤

  1. 如果收到的号码有一个标记1,则该号码为负数。否则,这是积极的。无论如何都要丢弃哨兵号码。
  2. 将二进制数转换为整数
  3. 如果整数为负数,则减去1
  4. 将整数乘以比例因子2/8192。
  5. 将此应用于您的数据会产生

    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。

    如果您不熟悉它,请查看两个赞美。这很酷。二进制数字几乎可以加入其中。

    编辑:我在第一步中遗漏了很多。如果第一位是1,则还需要不是每位。