我有以下字节存储在向量中:
data = [189 33 136 147]
这4个字节按照大端序表示一个单精度浮点数。我如何在MATLAB中获取这个数字?
我需要进行连接和转换。我尝试了:
x = typecast(str2num(sprintf('%d%d%d%d',data(1),data(2),data(3),data(4))), 'single')
无济于事(我得到了
x = []
)。我有以下字节存储在向量中:
data = [189 33 136 147]
这4个字节按照大端序表示一个单精度浮点数。我如何在MATLAB中获取这个数字?
我需要进行连接和转换。我尝试了:
x = typecast(str2num(sprintf('%d%d%d%d',data(1),data(2),data(3),data(4))), 'single')
x = []
)。x = typecast(uint8([data(4),data(3),data(2),data(1)]), 'single')
- JDStypecast(uint8(data(4:-1:1)),'single')
。我相信您已经意识到最大的四字节uint32
比realmax('single')
还要大?换句话说,任何大于[255 255 127 127]
的值都会溢出并导致NaN
。 - horchler如果有用的话,我会把这个留在这里。正如@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本地的浮点数。
fread
和fopen
以正确的选项读取数据,从一开始就将其作为正确的浮点数读取。 如果这些字节来自别处-可能不适用... - sebastianfread
,精度设置为'uint32=>double'
,机器格式为'ieee-be'
。 - Mark Mikofski