python - 如何在Python中从串行数据包中提取字节序列并将其更改为正确的整数表示形式?

标签 python int hex pyserial

374c4f4f00000800ff74**d102**29190300006f00ffffffffffffffffffff

这是我正在使用 pyserial 处理的串行数据包。粗体的两个字节实际上对应于现实世界的测量,对应于721(十进制)或02d1(十六进制)。如何在 python 中提取这些字节并获得正确的 int 值,即 721?

最佳答案

使用struct可以快速轻松地完成此类字节字符串的处理。库函数pack/pack_tounpack/unpack_from :

虽然通常最好的做法是解压/解压整个数据包,但您可以使用 _from 和 _to 版本来有选择地操作数据包。

就您而言:

>>> import struct
>>> val # Generated using  binascii.unhexlify
 b'7LOO\x00\x00\x08\x00\xfft\xd1\x02)\x19\x03\x00\x00o\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'
>>> struct.unpack_from('<H', val, 10)
(721,) # Note the return is a tupple so you need the 0th element
>>> struct.unpack_from('<H', val, 10)[0]
721

更多信息

>>> import struct
>>> help (struct.unpack)
Help on built-in function unpack in module _struct:

unpack(...)
    unpack(fmt, buffer) -> (v1, v2, ...)

    Return a tuple containing values unpacked according to the format string
    fmt.  Requires len(buffer) == calcsize(fmt). See help(struct) for more
    on format strings.
>>> help (struct.pack)
Help on built-in function pack in module _struct:

pack(...)
    pack(fmt, v1, v2, ...) -> bytes

    Return a bytes object containing the values v1, v2, ... packed according
    to the format string fmt.  See help(struct) for more on format strings.

>>> help(struct)
Help on module struct:

NAME
    struct

DESCRIPTION
    Functions to convert between Python values and C structs.
    Python bytes objects are used to hold the data representing the C struct
    and also as format strings (explained below) to describe the layout of data
    in the C struct.

    The optional first format char indicates byte order, size and alignment:
      @: native order, size & alignment (default)
      =: native order, std. size & alignment
      <: little-endian, std. size & alignment
      >: big-endian, std. size & alignment
      !: same as >

    The remaining chars indicate types of args and must match exactly;
    these can be preceded by a decimal repeat count:
      x: pad byte (no data); c:char; b:signed byte; B:unsigned byte;
      ?: _Bool (requires C99; if not available, char is used instead)
      h:short; H:unsigned short; i:int; I:unsigned int;
      l:long; L:unsigned long; f:float; d:double.
    Special cases (preceding decimal count indicates length):
      s:string (array of char); p: pascal string (with count byte).
    Special cases (only available in native format):
      n:ssize_t; N:size_t;
      P:an integer type that is wide enough to hold a pointer.
    Special case (not in native mode unless 'long long' in platform C):
      q:long long; Q:unsigned long long
    Whitespace between formats is ignored.

    The variable struct.error is an exception raised on errors.

关于python - 如何在Python中从串行数据包中提取字节序列并将其更改为正确的整数表示形式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37495676/

相关文章:

Java Double 转换为 Int round

C. ASCII 十六进制值数组的校验和计算

Python != 操作 vs "is not"

Python 在 for 循环期间卡住

python - 异常后重启程序

c - 将输入读入动态大小的 int?

java - 是否可以为 Int 数组中的所有数字赋值?

javascript - 自动生成十六进制 RGB 颜色

python - 如何异或等于十六进制字符串?

python - 字符串与列表类型和 NoneType