我有一些数据存储为Nx32
逻辑数组。每行代表我发送的UDP数据的一个字。我将它存储为逻辑数组,因为我可以访问任何单词,单词的一部分,甚至跨越单词边界。 (即,我可以将uint32
存储为[array(1, 17:32) array(2, 1:16)]
。目前,我根据输入字位置,LSB和MSB找到用户想要的数据。
我写入类中以从数据中的位置读取/写入的功能基本上要求我将任何给定的MATLAB数字类型或char转换为其二进制形式,然后将二进制形式存储到逻辑数组中,或者反之亦然。基本上有很多num2hex
和其他转换。 (实际上,我尝试使用,例如dec2bin(hex2dec(num2hex(pi)))
将浮点数转换为二进制,但输出不正确!)。
在C中,union
可以在数据类型之间轻松转换。我可以写一个int
并直接将其读作float
。这个功能在MATLAB中可行吗?如果有帮助,我可以访问所有工具箱。
答案 0 :(得分:4)
我不熟悉与Matlab中的union概念直接匹配的任何东西,但是可以获得相同的结果(使用更多的内存)。我相信你正在寻找typecast
,例如
x = uint32([1 2 3]);
y = typecast(x,'single')
如果您需要更改有效位的顺序,请使用swapbytes
。
编辑:如果你想处理逻辑,那么你将不得不使用二进制字符串作为中间步骤。我认为dec2bin
应该没问题(根据我的意见,不需要去十六进制)也许你的问题是你没有提供可选的第二个参数来指示要写多少位?
x = dec2bin(22,32)
您可以转换为逻辑并使用
翻转字节y = x=='1';
y = fliplr(y);
你也可以考虑在Matlab中使用Java,例如,这是为了双打:
x = java.lang.Double.doubleToLongBits(22);
y = java.lang.Long.toBinaryString(x)
答案 1 :(得分:1)
使用dec2bin(hex2dec(num2hex(pi)))并不精确,因为浮点数对于大数字具有较大的间隙,并且不能精确地表示整数。一种解决方法是将64位十六进制字符串拆分为两个32位字符串。例如,
hexpi = num2hex(pi)
firstbin = dec2bin(hex2dec(hexpi(1:8)));
secondbin = dec2bin(hex2dec(hexpi(9:16)));
% reconstruct
firsthex = dec2hex(bin2dec(firstbin));
secondhex = dec2hex(bin2dec(secondbin));
hexpi_reconstructed = [firsthex secondhex]
pi_reconstructed = hex2num(hexpi_reconstructed)
该代码应该重现相同的十六进制位。