我正在使用向我发送十六进制值的设备,我需要将这些值转换为他的实际浮点值。 在这里,您可以看到转换表:
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中做到这一点。
感谢您的帮助。
答案 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许可证)
步骤
将此应用于您的数据会产生
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,则还需要不是每位。