1

我有一些数据被存储为Nx32逻辑数组。每一行代表我正在发送的一个 UDP 数据字。我将它存储为一个逻辑数组,因为我可以访问任何单词、单词的一部分,甚至跨越单词边界。(即,我可能将 a 存储uint32[array(1, 17:32) array(2, 1:16)]。目前我根据输入的单词位置、LSB 和 MSB 找到用户想要的数据。

我正在写入类以从数据中的位置读取/写入的功能本质上要求我将任何给定的 MATLAB 数值类型或 char 转换为其二进制形式,然后将二进制形式存储到逻辑数组中,反之亦然。基本上有很多num2hex其他的转换。(实际上,我尝试使用例如将浮点数转换为二进制, dec2bin(hex2dec(num2hex(pi)))但输出不正确!)。

在 C 中,aunion可以很容易地在数据类型之间进行转换。我可以写一个int并直接读出它float。这个功能在 MATLAB 中可以实现吗?如果有帮助,我确实可以访问所有工具箱。

4

2 回答 2

4

我不熟悉与 Matlab 中的联合概念直接匹配的任何内容,但可以获得相同的结果(使用更多内存)。我相信你正在寻找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)
于 2013-10-01T15:50:35.860 回答
1

Using dec2bin(hex2dec(num2hex(pi))) is not precise, because floating point numbers have large gaps for large numbers and cannot precisely represent integers. One workaround is to split the 64 bit hex string into two 32 bit strings. For example,

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)

That code should reproduce the same hexadecimal bits.

于 2013-10-01T16:53:55.927 回答