1. 程式人生 > >Python——解析DSP儲存的二進位制32bit unsigned int資料

Python——解析DSP儲存的二進位制32bit unsigned int資料

使用python解析CCS中儲存的32bit unsigned int型別資料

目錄

使用python解析CCS中儲存的32bit unsigned int型別資料

正確方案

解析

精簡方案

參考文章


在DSP平臺下,編寫如下程式碼,儲存[0,512)的32bit,unsinged int 型別資料:

	unsigned int * p_L3_buffer = (unsigned int *)0x0c000000;

	unsigned int i = 0;

	for(i = 0; i < 512; i++)
	{
		p_L3_buffer[i] = i;
	}

程式執行完成後,將資料儲存成"xxxx.bin"格式的檔案,這裡儲存檔案時不是使用C語言中的讀寫檔案操作,而是CCS中的save memory按鈕,進行檔案的儲存;為了讀取解析該二進位制檔案,編寫python程式如下:

receive = []

with open('C:/workspace/save_file/p_L3_buffer.bin', 'rb') as f:
    with open('C:/workspace/save_file/p_L3_buffer_save.bin', 'wb') as w:
        for line in f.readlines():
            w.write(line)
            receive = struct.unpack('<i',line)
            print(line)

執行後遇到的問題:

receive = struct.unpack('<i',line)
struct.error: unpack requires a buffer of 4 bytes

正確方案

通過查詢各種資料,目前未找到直接將32bit 資料直接讀取出來的程式,根據各個前輩的智慧,編寫出如下程式碼,可以用來按照4bytes讀取資料,並將結果打印出來:

with open('C:/workspace/save_file/p_L3_buffer.bin', 'rb') as f:
        all_num = []
        while True:
            get_num = f.read(4)                 #每次讀取四位元組的資料
            #print(get_num)
            if (get_num == b''):                #判斷是否為檔案結尾,在檔案結尾時,會讀取到(b'')
                break
            num = struct.unpack('I', get_num)   #將結果按照格式進行解析, 'I'表示unsigned int
            all_num.append(num[0])              #將結果新增到all_num中,這裡num是一個tuple,即(x,)型別的資料
        print(all_num)

執行完打印出如下結果:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511]

 


解析

       如果直接使用read(),會將所有資料讀取數來,直接列印的話,效果如下:

      程式碼如下:

get_num = f.read()
print(get_num)
print(" end of reading all file ")

      結果如下:

b'\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x00\x00\t\x00\x00\x00\n\x00\x00\x00\x0b\x00\x00\x00\x0c\x00\x00\x00\r\x00\x00\x00\x0e\x00\x00\x00\x0f\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00\x12\x00\x00\x00\x13\x00\x00\x00\x14\x00\x00\x00\x15\x00\x00\x00\x16\x00\x00\x00\x17\x00\x00\x00\x18\x00\x00\x00\x19\x00\x00\x00\x1a\x00\x00\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x1d\x00\x00\x00\x1e\x00\x00\x00\x1f\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\x000\x00\x00\x001\x00\x00\x002\x00\x00\x003\x00\x00\x004\x00\x00\x005\x00\x00\x006\x00\x00\x007\x00\x00\x008\x00\x00\x009\x00\x00\x00:\x00\x00\x00;\x00\x00\x00<\x00\x00\x00=\x00\x00\x00>\x00\x00\x00?\x00\x00\[email protected]\x00\x00\x00A\x00\x00\x00B\x00\x00\x00C\x00\x00\x00D\x00\x00\x00E\x00\x00\x00F\x00\x00\x00G\x00\x00\x00H\x00\x00\x00I\x00\x00\x00J\x00\x00\x00K\x00\x00\x00L\x00\x00\x00M\x00\x00\x00N\x00\x00\x00O\x00\x00\x00P\x00\x00\x00Q\x00\x00\x00R\x00\x00\x00S\x00\x00\x00T\x00\x00\x00U\x00\x00\x00V\x00\x00\x00W\x00\x00\x00X\x00\x00\x00Y\x00\x00\x00Z\x00\x00\x00[\x00\x00\x00\\\x00\x00\x00]\x00\x00\x00^\x00\x00\x00_\x00\x00\x00`\x00\x00\x00a\x00\x00\x00b\x00\x00\x00c\x00\x00\x00d\x00\x00\x00e\x00\x00\x00f\x00\x00\x00g\x00\x00\x00h\x00\x00\x00i\x00\x00\x00j\x00\x00\x00k\x00\x00\x00l\x00\x00\x00m\x00\x00\x00n\x00\x00\x00o\x00\x00\x00p\x00\x00\x00q\x00\x00\x00r\x00\x00\x00s\x00\x00\x00t\x00\x00\x00u\x00\x00\x00v\x00\x00\x00w\x00\x00\x00x\x00\x00\x00y\x00\x00\x00z\x00\x00\x00{\x00\x00\x00|\x00\x00\x00}\x00\x00\x00~\x00\x00\x00\x7f\x00\x00\x00\x80\x00\x00\x00\x81\x00\x00\x00\x82\x00\x00\x00\x83\x00\x00\x00\x84\x00\x00\x00\x85\x00\x00\x00\x86\x00\x00\x00\x87\x00\x00\x00\x88\x00\x00\x00\x89\x00\x00\x00\x8a\x00\x00\x00\x8b\x00\x00\x00\x8c\x00\x00\x00\x8d\x00\x00\x00\x8e\x00\x00\x00\x8f\x00\x00\x00\x90\x00\x00\x00\x91\x00\x00\x00\x92\x00\x00\x00\x93\x00\x00\x00\x94\x00\x00\x00\x95\x00\x00\x00\x96\x00\x00\x00\x97\x00\x00\x00\x98\x00\x00\x00\x99\x00\x00\x00\x9a\x00\x00\x00\x9b\x00\x00\x00\x9c\x00\x00\x00\x9d\x00\x00\x00\x9e\x00\x00\x00\x9f\x00\x00\x00\xa0\x00\x00\x00\xa1\x00\x00\x00\xa2\x00\x00\x00\xa3\x00\x00\x00\xa4\x00\x00\x00\xa5\x00\x00\x00\xa6\x00\x00\x00\xa7\x00\x00\x00\xa8\x00\x00\x00\xa9\x00\x00\x00\xaa\x00\x00\x00\xab\x00\x00\x00\xac\x00\x00\x00\xad\x00\x00\x00\xae\x00\x00\x00\xaf\x00\x00\x00\xb0\x00\x00\x00\xb1\x00\x00\x00\xb2\x00\x00\x00\xb3\x00\x00\x00\xb4\x00\x00\x00\xb5\x00\x00\x00\xb6\x00\x00\x00\xb7\x00\x00\x00\xb8\x00\x00\x00\xb9\x00\x00\x00\xba\x00\x00\x00\xbb\x00\x00\x00\xbc\x00\x00\x00\xbd\x00\x00\x00\xbe\x00\x00\x00\xbf\x00\x00\x00\xc0\x00\x00\x00\xc1\x00\x00\x00\xc2\x00\x00\x00\xc3\x00\x00\x00\xc4\x00\x00\x00\xc5\x00\x00\x00\xc6\x00\x00\x00\xc7\x00\x00\x00\xc8\x00\x00\x00\xc9\x00\x00\x00\xca\x00\x00\x00\xcb\x00\x00\x00\xcc\x00\x00\x00\xcd\x00\x00\x00\xce\x00\x00\x00\xcf\x00\x00\x00\xd0\x00\x00\x00\xd1\x00\x00\x00\xd2\x00\x00\x00\xd3\x00\x00\x00\xd4\x00\x00\x00\xd5\x00\x00\x00\xd6\x00\x00\x00\xd7\x00\x00\x00\xd8\x00\x00\x00\xd9\x00\x00\x00\xda\x00\x00\x00\xdb\x00\x00\x00\xdc\x00\x00\x00\xdd\x00\x00\x00\xde\x00\x00\x00\xdf\x00\x00\x00\xe0\x00\x00\x00\xe1\x00\x00\x00\xe2\x00\x00\x00\xe3\x00\x00\x00\xe4\x00\x00\x00\xe5\x00\x00\x00\xe6\x00\x00\x00\xe7\x00\x00\x00\xe8\x00\x00\x00\xe9\x00\x00\x00\xea\x00\x00\x00\xeb\x00\x00\x00\xec\x00\x00\x00\xed\x00\x00\x00\xee\x00\x00\x00\xef\x00\x00\x00\xf0\x00\x00\x00\xf1\x00\x00\x00\xf2\x00\x00\x00\xf3\x00\x00\x00\xf4\x00\x00\x00\xf5\x00\x00\x00\xf6\x00\x00\x00\xf7\x00\x00\x00\xf8\x00\x00\x00\xf9\x00\x00\x00\xfa\x00\x00\x00\xfb\x00\x00\x00\xfc\x00\x00\x00\xfd\x00\x00\x00\xfe\x00\x00\x00\xff\x00\x00\x00\x00\x01\x00\x00\x01\x01\x00\x00\x02\x01\x00\x00\x03\x01\x00\x00\x04\x01\x00\x00\x05\x01\x00\x00\x06\x01\x00\x00\x07\x01\x00\x00\x08\x01\x00\x00\t\x01\x00\x00\n\x01\x00\x00\x0b\x01\x00\x00\x0c\x01\x00\x00\r\x01\x00\x00\x0e\x01\x00\x00\x0f\x01\x00\x00\x10\x01\x00\x00\x11\x01\x00\x00\x12\x01\x00\x00\x13\x01\x00\x00\x14\x01\x00\x00\x15\x01\x00\x00\x16\x01\x00\x00\x17\x01\x00\x00\x18\x01\x00\x00\x19\x01\x00\x00\x1a\x01\x00\x00\x1b\x01\x00\x00\x1c\x01\x00\x00\x1d\x01\x00\x00\x1e\x01\x00\x00\x1f\x01\x00\x00 \x01\x00\x00!\x01\x00\x00"\x01\x00\x00#\x01\x00\x00$\x01\x00\x00%\x01\x00\x00&\x01\x00\x00\'\x01\x00\x00(\x01\x00\x00)\x01\x00\x00*\x01\x00\x00+\x01\x00\x00,\x01\x00\x00-\x01\x00\x00.\x01\x00\x00/\x01\x00\x000\x01\x00\x001\x01\x00\x002\x01\x00\x003\x01\x00\x004\x01\x00\x005\x01\x00\x006\x01\x00\x007\x01\x00\x008\x01\x00\x009\x01\x00\x00:\x01\x00\x00;\x01\x00\x00<\x01\x00\x00=\x01\x00\x00>\x01\x00\x00?\x01\x00\[email protected]\x01\x00\x00A\x01\x00\x00B\x01\x00\x00C\x01\x00\x00D\x01\x00\x00E\x01\x00\x00F\x01\x00\x00G\x01\x00\x00H\x01\x00\x00I\x01\x00\x00J\x01\x00\x00K\x01\x00\x00L\x01\x00\x00M\x01\x00\x00N\x01\x00\x00O\x01\x00\x00P\x01\x00\x00Q\x01\x00\x00R\x01\x00\x00S\x01\x00\x00T\x01\x00\x00U\x01\x00\x00V\x01\x00\x00W\x01\x00\x00X\x01\x00\x00Y\x01\x00\x00Z\x01\x00\x00[\x01\x00\x00\\\x01\x00\x00]\x01\x00\x00^\x01\x00\x00_\x01\x00\x00`\x01\x00\x00a\x01\x00\x00b\x01\x00\x00c\x01\x00\x00d\x01\x00\x00e\x01\x00\x00f\x01\x00\x00g\x01\x00\x00h\x01\x00\x00i\x01\x00\x00j\x01\x00\x00k\x01\x00\x00l\x01\x00\x00m\x01\x00\x00n\x01\x00\x00o\x01\x00\x00p\x01\x00\x00q\x01\x00\x00r\x01\x00\x00s\x01\x00\x00t\x01\x00\x00u\x01\x00\x00v\x01\x00\x00w\x01\x00\x00x\x01\x00\x00y\x01\x00\x00z\x01\x00\x00{\x01\x00\x00|\x01\x00\x00}\x01\x00\x00~\x01\x00\x00\x7f\x01\x00\x00\x80\x01\x00\x00\x81\x01\x00\x00\x82\x01\x00\x00\x83\x01\x00\x00\x84\x01\x00\x00\x85\x01\x00\x00\x86\x01\x00\x00\x87\x01\x00\x00\x88\x01\x00\x00\x89\x01\x00\x00\x8a\x01\x00\x00\x8b\x01\x00\x00\x8c\x01\x00\x00\x8d\x01\x00\x00\x8e\x01\x00\x00\x8f\x01\x00\x00\x90\x01\x00\x00\x91\x01\x00\x00\x92\x01\x00\x00\x93\x01\x00\x00\x94\x01\x00\x00\x95\x01\x00\x00\x96\x01\x00\x00\x97\x01\x00\x00\x98\x01\x00\x00\x99\x01\x00\x00\x9a\x01\x00\x00\x9b\x01\x00\x00\x9c\x01\x00\x00\x9d\x01\x00\x00\x9e\x01\x00\x00\x9f\x01\x00\x00\xa0\x01\x00\x00\xa1\x01\x00\x00\xa2\x01\x00\x00\xa3\x01\x00\x00\xa4\x01\x00\x00\xa5\x01\x00\x00\xa6\x01\x00\x00\xa7\x01\x00\x00\xa8\x01\x00\x00\xa9\x01\x00\x00\xaa\x01\x00\x00\xab\x01\x00\x00\xac\x01\x00\x00\xad\x01\x00\x00\xae\x01\x00\x00\xaf\x01\x00\x00\xb0\x01\x00\x00\xb1\x01\x00\x00\xb2\x01\x00\x00\xb3\x01\x00\x00\xb4\x01\x00\x00\xb5\x01\x00\x00\xb6\x01\x00\x00\xb7\x01\x00\x00\xb8\x01\x00\x00\xb9\x01\x00\x00\xba\x01\x00\x00\xbb\x01\x00\x00\xbc\x01\x00\x00\xbd\x01\x00\x00\xbe\x01\x00\x00\xbf\x01\x00\x00\xc0\x01\x00\x00\xc1\x01\x00\x00\xc2\x01\x00\x00\xc3\x01\x00\x00\xc4\x01\x00\x00\xc5\x01\x00\x00\xc6\x01\x00\x00\xc7\x01\x00\x00\xc8\x01\x00\x00\xc9\x01\x00\x00\xca\x01\x00\x00\xcb\x01\x00\x00\xcc\x01\x00\x00\xcd\x01\x00\x00\xce\x01\x00\x00\xcf\x01\x00\x00\xd0\x01\x00\x00\xd1\x01\x00\x00\xd2\x01\x00\x00\xd3\x01\x00\x00\xd4\x01\x00\x00\xd5\x01\x00\x00\xd6\x01\x00\x00\xd7\x01\x00\x00\xd8\x01\x00\x00\xd9\x01\x00\x00\xda\x01\x00\x00\xdb\x01\x00\x00\xdc\x01\x00\x00\xdd\x01\x00\x00\xde\x01\x00\x00\xdf\x01\x00\x00\xe0\x01\x00\x00\xe1\x01\x00\x00\xe2\x01\x00\x00\xe3\x01\x00\x00\xe4\x01\x00\x00\xe5\x01\x00\x00\xe6\x01\x00\x00\xe7\x01\x00\x00\xe8\x01\x00\x00\xe9\x01\x00\x00\xea\x01\x00\x00\xeb\x01\x00\x00\xec\x01\x00\x00\xed\x01\x00\x00\xee\x01\x00\x00\xef\x01\x00\x00\xf0\x01\x00\x00\xf1\x01\x00\x00\xf2\x01\x00\x00\xf3\x01\x00\x00\xf4\x01\x00\x00\xf5\x01\x00\x00\xf6\x01\x00\x00\xf7\x01\x00\x00\xf8\x01\x00\x00\xf9\x01\x00\x00\xfa\x01\x00\x00\xfb\x01\x00\x00\xfc\x01\x00\x00\xfd\x01\x00\x00\xfe\x01\x00\x00\xff\x01\x00\x00'

 

     如果不做格式轉換,即不執行:

num = struct.unpack('I', get_num)
get_num = f.read(4)
print(get_num)

     結果就會如下:

b'\x00\x00\x00\x00'

 修改過後如下:

get_num = f.read(4)
num = struct.unpack('I',get_num)
print(num)

結果變為:

(0,)

 使用append方法將資料值新增到末尾:

all_num.append(num[0])

根據參考文章1中的方法修改解析模組,直接獲取unpack的結果:

(num,) = struct.unpack('I', get_num)#將結果按照格式進行解包, 'I'表示unsigned int
all_num.append(num)                 #將結果新增到all_num中,這裡num是一個tuple,即(x,)型別的資料

或者:

num, = struct.unpack('I', get_num)#將結果按照格式進行解包, 'I'表示unsigned int
all_num.append(num)                 #將結果新增到all_num中,這裡num是一個tuple,即(x,)型別的資料

將num直接解放出來,得到的就只僅僅是一個值,而不是一個list


精簡方案

多謝參考文章2中的方法帶來的靈感,讓我走出了誤區,編寫一個去除迴圈的方式:

將unpack中的fmt提取出來,進行單獨的賦值,可以建立一個動態讀取解析二進位制檔案的方式

with open('C:/workspace/save_file/p_L3_buffer.bin', 'rb') as f:
        get_nums = f.read()
        Len_get_nums = len(get_nums)
        bytes_num = Len_get_nums >> 2
        format = "%dI" % bytes_num 
        num = struct.unpack(format, get_nums)
        print(num)

 去除了while迴圈整個程式碼變得簡潔了很多,可以將程式更加精簡為:

with open('C:/workspace/save_file/p_L3_buffer.bin', 'rb') as f:
        get_nums = f.read()
        num = struct.unpack(("%dI" % (len(get_nums) >> 2)), get_nums)
        print(num)

得到的結果num是一個tuple 


參考文章

1. python 中使用struct處理二進位制資料   http://www.cnblogs.com/gala/archive/2011/09/22/2184801.html

2. python中struct.unpack的用法 https://blog.csdn.net/gracioushe/article/details/5915900

 


如果哪位大神有更好的方式解析二進位制的資料,歡迎評論留言!!!