Python:使用struct() 對二進位數據打包、解包 data = struct.pack (format_str, 1, 2, 3.14) ; result = struct.unpack (format_str, data) ; numpy.fromfile() ;

加入好友
加入社群
Python:使用struct() 對二進位數據打包、解包 data = struct.pack (format_str, 1, 2, 3.14) ; result = struct.unpack (format_str, data) ; numpy.fromfile() ; - 儲蓄保險王

struct 是 Python 標準函式庫中用於二進位數據打包、解包的模組。它可以將不同類型的數據打包成二進位的字符串(bytes),或者從二進位的字符串中解包出數據。常用的格式化字符串包括:

  • b: 1 bytes,表示有符號字符(signed char),取值范围为-128~127;
  • B: 1 bytes,表示無符號字符(unsigned char),取值范围为0~255;
  • h: 2 bytes,表示有符號短整數(signed short);
  • H: 2 bytes,表示無符號短整數(unsigned short),取值范围为0~65535;
  • i: 4 bytes,表示有符號整數(signed int);
  • I: 4 bytes,表示無符號整數(unsigned int),取值范围为0~4294967295;
  • e: 2 bytes,表示半精度浮點數(float)
  • f: 4 bytes,表示單精度浮點數(float);
  • d: 8 bytes,表示雙精度浮點數(double),取值范围和精度请参考 IEEE 754 标准。
  • “q”:表示8 bytes(64位)有符号整数,取值范围为-9223372036854775808~9223372036854775807。
  • “Q”:表示8 bytes(64位)无符号整数,取值范围为0~18446744073709551615。
  • “d”:表示8 bytes(64位)双精度浮点数,取值范围和精度请参考 IEEE 754 标准。
  • “s”:表示字符串,需要指定字符串的长度。例如,”10s” 表示长度为10的字符串。

以下是一個使用 struct 打包、解包的範例:

 

import struct

# 定義一個格式化字串
format_str = “hif”

# 構建一個字節數組
data = struct.pack(format_str, 1, 2, 3.14)

# 從字節數組解析出數據
result = struct.unpack(format_str, data)

print(result) # 輸出:(1, 2, 3.140000104904175)

Python:使用struct() 對二進位數據打包、解包 data = struct.pack (format_str, 1, 2, 3.14) ; result = struct.unpack (format_str, data) ; numpy.fromfile() ; - 儲蓄保險王

推薦hahow線上學習python: https://igrape.net/30afN

struct.unpack()期望整個緩衝區作為輸入,並根據提供的格式字符串將其解開。 緩衝區的尺寸必須與格式大小相匹配。
另一方面,struct.unpack_from()還期望緩衝區和格式字符串作為輸入,但允許呼叫者在應開始解開包裝的緩衝區中指定偏移量。 從指定偏移量開始的緩衝區大小至少必須是格式字符串所需的大小。 當使用太大而無法完全適合內存的大數據結構時,此功能很有用,因為它可以一次讀取和解開結構的部分。

import struct
import csv

# Specify the file path of the binary .dat file
filename = “xwr14xx_processed_stream_2023_03_03T07_52_14_957.dat”

# Open the binary .dat file in binary mode
with open(filename, “rb”) as f:
# Read in the data
    data = f.read()

format_str = “3f6h” #fffhhhhhh 也可
#3個f(浮點數),6個h(短整數)
#依據說明書寫的 Data Structure
“””
“h”: 表示一個short型數據,在Python中為整型,大小為2 bytes。
“signed short”,取值範圍為-32768~32767。
“i”: 表示一個int型數據,在Python中為整型,大小為4 bytes。
符号表示為”signed int”,取值範圍為-2147483648~2147483647。
“f”: 表示的是 4 bytes浮點數(單精度浮點數)
“””

# Calculate the number of data points in the file
num_points = len(data) // struct.calcsize(format_str)

# Create a list to store the parsed data
point_cloud = []

# Parse the binary data and store it in the point_cloud list
for i in range(num_points):
# Unpack the data from binary to a tuple of values
    values = struct.unpack_from(format_str, data, i * struct.calcsize(format_str))
#print(“values:”,values)
#struct.unpack_from(format, buffer, offset=0)
“”” values:
(4.634528788092132e-23,
1.3771305118979144e-21,
3.283798787497549e-21,
7264, 6968, 6744, 6704, 6728, 6712)
#tuple內容為3個浮點數,6個整數
#format_str = “fffhhhhhh” “””
# Append the values to the point_cloud list
point_cloud.append(values)

# Convert the point_cloud list to a numpy array
# import numpy as np
# point_cloud = np.array(point_cloud)

# Write the point_cloud data to a CSV file
with open(“output.csv”, “w”, newline=””) as f2:
writer = csv.writer(f2)
writer.writerows(point_cloud)

Python:使用struct() 對二進位數據打包、解包 data = struct.pack (format_str, 1, 2, 3.14) ; result = struct.unpack (format_str, data) ; numpy.fromfile() ; - 儲蓄保險王

Python:使用struct() 對二進位數據打包、解包 data = struct.pack (format_str, 1, 2, 3.14) ; result = struct.unpack (format_str, data) ; numpy.fromfile() ; - 儲蓄保險王

推薦hahow線上學習python: https://igrape.net/30afN

struct.unpack() vs numpy.fromfile()

format_str_Objs6 = “<3h3e”
#末六個(迴圈內) #e:2 bytes 半精度浮點數
#H: 2 bytes,表示無符號短整數(unsigned short)
#h: 2 bytes,表示有符號短整數(signed short)

lisObjStruct=[(“Range Index”,”Doppler Index”,”Peak Value”,
“X”,”Y”,”Z”)]
startIdx=36+12

for i in range(num_of_Data_Structures):
    tup_obj6 = struct.unpack(format_str_Objs6,
    data[startIdx:startIdx+12])
#tup_obj6
#(6136, 6248, 6736, 0.0035858154296875,
# 0.00274658203125, 0.00191497802734375)
#三個無符號短整數,三個半精度浮點數,共六個
    lisObjStruct.append(tup_obj6)
    startIdx += 12

Python:使用struct() 對二進位數據打包、解包 data = struct.pack (format_str, 1, 2, 3.14) ; result = struct.unpack (format_str, data) ; numpy.fromfile() ; - 儲蓄保險王

改用numpy.fromfile()

#format_str_Objs6 = “<3h3e”
#num_of_Data_Structures = …

lisObjStruct=[(“Range Index”,”Doppler Index”,”Peak Value”,
“X”,”Y”,”Z”)]

startIdx = 36 + 12

# 設定要讀取的資料型態
dt = np.dtype([
(‘field1’, np.uint16),
(‘field2’, np.uint16),
(‘field3’, np.uint16),
(‘field4’, np.float16),
(‘field5’, np.float16),
(‘field6’, np.float16)
])

#numpy的dtype() #i2:16位整數 #f2:半精度浮點數

# 讀取資料
data_arr = np.fromfile(filename, dtype=dt,
count=num_of_Data_Structures,
offset=startIdx)

#不需要for迴圈了,用count參數取

 

# 把讀取的資料轉成 list
lisObjStruct = data_arr.tolist()

Python:使用struct() 對二進位數據打包、解包 data = struct.pack (format_str, 1, 2, 3.14) ; result = struct.unpack (format_str, data) ; numpy.fromfile() ; - 儲蓄保險王

推薦hahow線上學習python: https://igrape.net/30afN

加入好友
加入社群
Python:使用struct() 對二進位數據打包、解包 data = struct.pack (format_str, 1, 2, 3.14) ; result = struct.unpack (format_str, data) ; numpy.fromfile() ; - 儲蓄保險王

儲蓄保險王

儲蓄險是板主最喜愛的儲蓄工具,最喜愛的投資理財工具則是ETF,最喜愛的省錢工具則是信用卡

You may also like...

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *