我有一个从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
答案 0 :(得分:1)
当字符与常规hexadecimal字符不对应时,Python会向您显示ascii中表示的二进制数据。例如,\xa3
是十六进制值A3
的字节,二进制为10100011
。另一方面,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']