Python 什么类型的数据以\分隔,并且是十六进制的?

Python 什么类型的数据以\分隔,并且是十六进制的?,python,Python,我有一个从pixhawk中提取的数据集。我试图解析这些数据,并绘制其中一些与时间的关系图。问题是当我使用此代码打开其中一个bin文件时: with open("px4log.bin", "rb") as binary_file: # Read the whole file at once data = binary_file.read() print(data) 我得到的数据如下所示: b'\xa3\x95\x80\x80YFMT\x00BBnNZ\x00\x00\x0

我有一个从pixhawk中提取的数据集。我试图解析这些数据,并绘制其中一些与时间的关系图。问题是当我使用此代码打开其中一个bin文件时:

with open("px4log.bin", "rb") as binary_file:
    # Read the whole file at once
    data = binary_file.read()
    print(data)
我得到的数据如下所示:

b'\xa3\x95\x80\x80YFMT\x00BBnNZ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Type,Length,Name,Format,Columns\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x95\x80\x81\x17PARMNf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Name,Value\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x95\x80\x82-GPS\x00BIHBcLLeeEefI\x00\x00\x00Status,TimeMS,Week,NSats,HDop,Lat,Lng,RelAlt,Alt,Spd,GCrs,VZ,T\x00\x00\xa3\x95\x80\x83\x1fIMU\x00Iffffff\x00\x00\x00\x00\x00\x00\x00\x00\x00TimeMS,GyrX,GyrY,GyrZ,AccX,AccY,AccZ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0
我被告知它应该是二进制的,但它不是。除非python在打开数据集时对数据集做了什么

如果您愿意,可以从以下位置下载此示例数据集:

https://pixhawk.org/_media/downloads/px4log_sample_1.px4log.zip

当字符与常规字符不对应时,Python将向您显示中表示的二进制数据。例如,
\xa3
是一个十六进制值的字节
A3
,它是二进制的
10100011
<另一方面,code>T可以打印为
\x54
,它是二进制值的字节
01010100
。由于您使用了
print
函数,python假定您正在尝试将二进制数据转换为人类可读的字符串,因此它没有显示
\x54
,而是显示相应的字符
T

您可以使用以下代码获取表示数据的二进制字符串数组:

data = '\xa3\x95\x80\x80YFMT\x00BBnNZ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Type,Length,Name,Format,Columns'

decimalArray = map(ord,data)
byteArray = map(lambda x: "{0:b}".format(x), decimalArray)
print byteArray
以下是输出:

['10100011', '10010101', '10000000', '10000000', '1011001', '1000110', '1001101', '1010100', '0', '1000010', '1000010', '1101110', '1001110', '1011010', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1010100', '1111001', '1110000', '1100101', '101100', '1001100', '1100101', '1101110', '1100111', '1110100', '1101000', '101100', '1001110', '1100001', '1101101', '1100101', '101100', '1000110', '1101111', '1110010', '1101101', '1100001', '1110100', '101100', '1000011', '1101111', '1101100', '1110101', '1101101', '1101110', '1110011']

'b'
附加到模式后,以二进制模式打开文件:现在数据以字节对象的形式读取和写入。”下一个问题是“但是我应该如何处理这些字节?”,答案是@CoryKramer我知道每个字节的位置吗?比如,数据的结构是否有一个关键点?或者我不需要知道?短语“二进制”通常意味着“非文本”-当然,所有东西最终都是二进制的。
b'
前缀表示这是一个字节对象,当字节不映射到单字节字符时,字节将以十六进制的形式尽可能显示。你为什么说它不是二进制的?
\x00
终止字节看起来像是来自C。这一个:我明白了,但这不会使数据更难解析吗?@J.Jones:Alden试图向您解释一些事情,而不是向您展示一种设置解析数据的方法。@BillBell明白了,所以这就是python阅读的方式。从其他评论中我仍然不明白的是,我如何告诉python数据结构是什么。我试着在unpack.struct上阅读,但要做到这一点,它遇到了麻烦。@J.Jones:啊,你必须先告诉我们一些事情!至少我们这些人对皮克斯霍克一无所知。它产生的数据结构是什么?如果你能告诉我们,那么这里可能会有人告诉你如何抛出一个Python结构来匹配它。@J.Jones我建议为这个问题创建一个新的问题,因为这个问题只询问打印字符串中的十六进制表示。