python解析c型別資料

壹点灵异發表於2024-08-20

在 C 語言中,有很多種基本的資料型別,如bool char, int, long, float, double 等。在 Python 中,可以使用 struct 模組來解碼這些型別的二進位制表示。

以下是 C 語言中的常見型別以及對應的 Python 解碼方法:

C 語言型別及其 Python 解碼格式

  1. char (字元)

    • C 型別char
    • Python 格式'c' (單個字元)
    • 位元組大小:1 位元組
    • 示例解碼
      import struct
      
      data_char = b'\x41'  # 這代表字元 'A'
      
      # 解碼 char 型別
      char_value = struct.unpack('<c', data_char)[0]
      
      print(char_value)  # 輸出: b'A'
  2. signed char (帶符號字元)

    • C 型別signed char
    • Python 格式'b' (帶符號的單個位元組)
    • 位元組大小:1 位元組
    • 示例解碼
      data_schar = b'\x01'  # 這代表 signed char 型別的 1
      
      # 解碼 signed char 型別
      schar_value = struct.unpack('<b', data_schar)[0]
      
      print(schar_value)  # 輸出: 1
  3. unsigned char (無符號字元)

    • C 型別unsigned char
    • Python 格式'B' (無符號的單個位元組)
    • 位元組大小:1 位元組
    • 示例解碼
      data_uchar = b'\x01'  # 這代表 unsigned char 型別的 1
      
      # 解碼 unsigned char 型別
      uchar_value = struct.unpack('<B', data_uchar)[0]
      
      print(uchar_value)  # 輸出: 1
  4. short (短整型)

    • C 型別short
    • Python 格式'h' (帶符號的短整型)
    • 位元組大小:2 位元組
    • 示例解碼
      data_short = b'\x00\x01'  # 這代表 short 型別的 1
      
      # 解碼 short 型別
      short_value = struct.unpack('<h', data_short)[0]
      
      print(short_value)  # 輸出: 1
  5. unsigned short (無符號短整型)

    • C 型別unsigned short
    • Python 格式'H' (無符號的短整型)
    • 位元組大小:2 位元組
    • 示例解碼
      data_ushort = b'\x00\x01'  # 這代表 unsigned short 型別的 1
      
      # 解碼 unsigned short 型別
      ushort_value = struct.unpack('<H', data_ushort)[0]
      
      print(ushort_value)  # 輸出: 1
  6. int (整型)

    • C 型別int
    • Python 格式'i' (帶符號的整型)
    • 位元組大小:4 位元組
    • 示例解碼
      data_int = b'\x00\x00\x00\x01'  # 這代表 int 型別的 1
      
      # 解碼 int 型別
      int_value = struct.unpack('<i', data_int)[0]
      
      print(int_value)  # 輸出: 1
  7. unsigned int (無符號整型)

    • C 型別unsigned int
    • Python 格式'I' (無符號的整型)
    • 位元組大小:4 位元組
    • 示例解碼
      data_uint = b'\x00\x00\x00\x01'  # 這代表 unsigned int 型別的 1
      
      # 解碼 unsigned int 型別
      uint_value = struct.unpack('<I', data_uint)[0]
      
      print(uint_value)  # 輸出: 1
  8. long (長整型)

    • C 型別long
    • Python 格式'l' (帶符號的長整型)
    • 位元組大小:4 位元組
    • 示例解碼
      data_long = b'\x00\x00\x00\x01'  # 這代表 long 型別的 1
      
      # 解碼 long 型別
      long_value = struct.unpack('<l', data_long)[0]
      
      print(long_value)  # 輸出: 1
  9. unsigned long (無符號長整型)

    • C 型別unsigned long
    • Python 格式'L' (無符號的長整型)
    • 位元組大小:4 位元組
    • 示例解碼
      data_ulong = b'\x00\x00\x00\x01'  # 這代表 unsigned long 型別的 1
      
      # 解碼 unsigned long 型別
      ulong_value = struct.unpack('<L', data_ulong)[0]
      
      print(ulong_value)  # 輸出: 1
  10. long long (長長整型)

    • C 型別long long
    • Python 格式'q' (帶符號的長長整型)
    • 位元組大小:8 位元組
    • 示例解碼
      data_llong = b'\x00\x00\x00\x00\x00\x00\x00\x01'  # 這代表 long long 型別的 1
      
      # 解碼 long long 型別
      llong_value = struct.unpack('<q', data_llong)[0]
      
      print(llong_value)  # 輸出: 1
  11. unsigned long long (無符號長長整型)

    • C 型別unsigned long long
    • Python 格式'Q' (無符號的長長整型)
    • 位元組大小:8 位元組
    • 示例解碼
      data_ullong = b'\x00\x00\x00\x00\x00\x00\x00\x01'  # 這代表 unsigned long long 型別的 1
      
      # 解碼 unsigned long long 型別
      ullong_value = struct.unpack('<Q', data_ullong)[0]
      
      print(ullong_value)  # 輸出: 1
  12. float (單精度浮點型)

    • C 型別float
    • Python 格式'f' (單精度浮點型)
    • 位元組大小:4 位元組
    • 示例解碼
      data_float = b'\x00\x00\x80\x3f'  # 這代表 float 型別的 1.0
      
      # 解碼 float 型別
      float_value = struct.unpack('<f', data_float)[0]
      
      print(float_value)  # 輸出: 1.0
  13. double (雙精度浮點型)

    • C 型別double
    • Python 格式'd' (雙精度浮點型)
    • 位元組大小:8 位元組
    • 示例解碼
      data_double = b'\x00\x00\x00\x00\x00\x00\xf0?'  # 這代表 double 型別的 1.0
      
      # 解碼 double 型別
      double_value = struct.unpack('<d', data_double)[0]
      
      print(double_value)  # 輸出: 1.0
  14. bool (布林型別)

    • C 型別boolunsigned char 用於布林值(通常表示為 0 或 1)
    • Python 格式'B' (無符號的單個位元組,通常用於布林值)
    • 位元組大小:1 位元組
    • 示例解碼
      data_bool = b'\x01'  # 這代表 bool 型別的 True (1)
      
      # 解碼 bool 型別
      bool_value = struct.unpack('<B', data_bool)[0] != 0
      
      print(bool_value)  # 輸出: True

注意事項:

  • 位元組序可以在格式字串中指定,例如 < 表示小端位元組序,> 表示大端位元組序。
  • 上述示例假設資料是按照小端位元組序排列的,因此使用 < 作為位元組序標誌。
  • 根據平臺的不同,某些型別的位元組大小可能會有所不同(例如 intlong)。
  • 當解碼布林型別時,通常使用 != 0 來將其轉換為 Python 的布林值。
  • 根據平臺的不同,某些型別的位元組大小可能會有所不同(例如 intlong

相關文章