Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MatLab中十六进制到浮点的转换_Matlab_Binary_Numbers - Fatal编程技术网

MatLab中十六进制到浮点的转换

MatLab中十六进制到浮点的转换,matlab,binary,numbers,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

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

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中实现它


感谢您的帮助。

如果您的二进制表示形式以字符串形式存储在变量
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)

以下是我在没有更多关于所用二进制表示的信息的情况下所能得到的最接近的结果:

%# 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

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

步骤是

  • 如果传入号码有sentinel 1,则该号码为负数。除此之外,这是积极的。不管怎样,都要删除哨兵号码
  • 将二进制数转换为整数
  • 如果整数为负,则减去1
  • 将整数乘以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 1111是否可能为2.04775g

    我假设您正在尝试与2G到-2G范围内的accelermoter(或其他设备)接口。如果文件上说是2G到-2G,那么他们可能已经在2.04775G到-2.05G的真实全范围内四舍五入了

    如果你不熟悉,查两个赞美词。这是很酷的东西。二进制数实际上是自己加进去的


    编辑:我在第一步就做了一个巨大的遗漏。如果第一位是1,你也不需要每一位。

    你的标题是“十六进制到整数”,你的问题体是“十六进制到浮点”…它甚至不是更像二进制的“十六进制”…你可以看一看,它不会给出相同的结果,但我想你已经接近了。。。给出的数据看起来像某种有符号的。我们真的需要更多的信息从OPI验证这一点之前张贴;我同意,它们是不同的,但只是在最低有效位(并且只有1)。我最好的猜测是,这实际上是由于OP的舍入误差造成的。如果我错了,这个解决方案是无效的。你是对的,我正在接收来自加速度计的数据,加速度计以无线方式向我发送信息。我没有编写加速计的代码,但现在它向我发送了原始数据,因此我必须转换数据并在PC中显示。我做了一个从-2g到1.99975的可查找表(我从加速计的数据表中获取此值)