MATLAB将big-endian顺序字节转换为浮点值

时间:2013-12-12 04:26:00

标签: matlab floating-point byte endianness

我在向量中存储了以下字节:

data = [189    33   136   147]

这4个字节表示Big-endian顺序的单个浮点数。如何在MATLAB中获得此编号?

我需要连接和转换。我试过了:

x = typecast(str2num(sprintf('%d%d%d%d',data(1),data(2),data(3),data(4))), 'single')

无济于事(我得到x = [])。

2 个答案:

答案 0 :(得分:3)

很好的例子here

>> dataL = typecast(uint8([189, 33, 136, 147]), 'uint32')
dataL =
   2475172285
>> dataF = double(dataL)
dataF =
   2.4752e+09

从大到小,尝试swapbytes

>> dataLbig = swapbytes(dataL)
dataLbig =
   3173091475
>> dataFbig = double(dataLbig)
dataFbig =
   3.1731e+09

这是你期待的吗?

答案 1 :(得分:2)

我会留在这里以防它对任何人都有用。正如@MarkMikofski所示,使用typecastswapbytes是此标准方法。但是,如果您的数据已经是浮点数,则在某些情况下这些函数可能效率低下。我在视频编码/解码工具中使用以下实用程序功能:

function x = Bit32toDouble(y)
n = numel(y);
if n >= 65536
    x = double(swapbytes(typecast(uint8(y(:)),'uint32'))).';
elseif n > 4
    x = sum(bsxfun(@times,[16777216;65536;256;1],reshape(y(:),4,n/4)));
else
    x = sum([16777216;65536;256;1].*y(:));
end

根据传入的字节数,有单独的情况。只有在一次处理大量数据时,typecast / swapbytes才能最有效。如果使用较小的输入重复调用该函数,这在我的应用程序中很常见,其他情况要快得多,因为它们在Matlab的本机浮点中执行所有操作。