我在向量中存储了以下字节:
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 = []
)。
答案 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所示,使用typecast
和swapbytes
是此标准方法。但是,如果您的数据已经是浮点数,则在某些情况下这些函数可能效率低下。我在视频编码/解码工具中使用以下实用程序功能:
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的本机浮点中执行所有操作。