由\分隔的什么类型的数据是十六进制的?

时间:2016-10-14 15:36:44

标签: 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\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

1 个答案:

答案 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']