繁体   English   中英

Python f.read()和Octave fread()。 =>读取显示相同值的二进制文件

[英]Python f.read() and Octave fread(). => Reading a binary file showing the same values

我正在用Octave和Python读取带有信号样本的二进制文件。

问题是,我想为两个代码获得相同的值,事实并非如此。

二进制文件基本上是一个复杂格式为I,Q的信号,记录为16位Int。

因此,基于八度代码:

[data, cnt_data] = fread(fid, 2 * secondOfData * fs, 'int16');

接着:

data = data(1:2:end) + 1i * data(2:2:end);

看起来很简单,只需将二进制数据读取为16位int。 然后创建最终的复数数组。

因此,我假设在Python中我需要执行以下操作:

rel=int(f.read(2).encode("hex"),16)
img=int(f.read(2).encode("hex"),16)
in_clean.append(complex(rel,img))

好的,我的主要问题是实部和虚部的值都不相同。

例如,在八度中,第一个值是: -20390-10053i

在Python中(应用上面的代码),值是:(23216 + 48088j)

由于符号不同,所以我首先想到的是,记录该文件的计算机的字节序可能与我用来读取该文件的计算机的字节序不同。 因此,我转向解压缩功能,因为它允许您强制使用字节序类型。

我在解压缩文档中找不到“ int16”: https ://docs.python.org/2/library/struct.html

因此,我选择添加“ x”(填充字节)的“ i”选项,以满足“结构”文档中表中32位的要求。

因此:

struct.unpack("i","xx"+f.read(2))[0]

结果为(-1336248200-658802568j)使用struct.unpack("<i","xx"+f.read(2))[0]提供相同的结果。

附:

struct.unpack(">i","xx"+f.read(2))[0]

值是:(2021153456 + 2021178328j)

附:

struct.unpack(">i",f.read(2)+"xx")[0]

值是:(1521514616-1143441288j)

附:

struct.unpack("<i",f.read(2)+"xx")[0]

值是:(2021175386 + 2021185723j)

我也尝试了numpy和“ frombuffer”:

np.frombuffer(f.read(1).encode("hex"),dtype=np.int16)

具有提供:(24885 + 12386j)

那么,关于我在做什么错的任何想法吗? 我想获得与八度相同的值。

在Python中读取和解释值的正确方法是什么,以便通过使用带'int16'的fread来获得与Octave相同的值?

我一直在互联网上寻找答案,但是找不到能够提供相同价值的方法

非常感谢

看来您问题中的二进制数据是5ab0bbd8 要使用struct.unpack解压缩带符号的16位整数,请使用'h'格式字符。 (23216+48088j)输出来看,数据似乎被编码为little-endian,因此我们需要使用<作为格式字符串中的第一项。

from struct import unpack

data = b'\x5a\xb0\xbb\xd8'

# The wrong way
rel=int(data[:2].encode("hex"),16)
img=int(data[2:].encode("hex"),16)
c = complex(rel, img)
print c

# The right way
rel, img = unpack('<hh', data)
c = complex(rel, img)
print c 

产量

(23216+48088j)
(-20390-10053j)

请注意, rel, img = unpack('<hh', data)也将在Python 3上正常工作。


FWIW,在Python 3,你也可以解码2个字节,以这样的符号整数:

def int16_bytes_to_int(b):
    n = int.from_bytes(b, 'little')
    if n > 0x7fff:
        n -= 0x10000
    return n

Python 2中的大致等效项是:

def int16_bytes_to_int(b):
    lo, hi = b
    n = (ord(hi) << 8) + ord(lo)
    if n > 0x7fff:
        n -= 0x10000
    return n

但是必须进行这种减法处理带符号的数字很烦人,并且使用struct.unpack肯定会更加高效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM