编码

问题来源

最近要根据一份国家标准协议进行解码,但是对于进制,字节,字符,编码,转码有比较多的问题。其中我想实现的主要需求如下:

  1. 有客户端与服务端,进行tcp通信,客户端要发送一个请求,tcp中payload请求大概是这样,有很多个十六进制表示的字节组成

image.png

  1. 根据协议的规定,从中间取出某几个字节进行编码 ,比如第五个位置-第六个位置,2个字节的代表 学生人数,某几个字节代表学生姓名。协议指出采用ASCII码编码,与汉字采用GBK编码

字符与字节

  • 字符:数字,符号,字母
  • 字节:8byte位构成一个字节,单个字节可以由两个十六进制数或者8个二进制进行标识。

一个字节在十进制表示中是0-255,即0000 0000到1111 1111,十六进制字符可以表示4个二进制位,所以两个十六进制字符可以表示8个二进制位

  • 在计算机中每一个字符都对应着唯一的数字编码,也被称为字符编码或者字符集

举个例子

如果有客户端跟服务端,那么中间传输的字节,可以有不同的编码方式,比如说字母跟数字可以采用最常见的ASCII编码方式,但是如果有中文时,我们还可以对这个中文字符采用GBK编码,只不过在解码的时候再通过这种方式解决。

常见的编码方式

  • ASCII:最常见的编码方式
  • UTF-8:变长字节存储unicode字符,用于保存文本数据的编码
  • UTF-16:使用两个字节表示unicode
  • GBK编码:国家标准编码,支持简体中文和繁体中文。
  • ISO-8859编码:使用单字节表示字符,支持多种语言,包括英语、西班牙语、德语等

在python中进行解码的方式

struct是用来解决bytes和其他二进制数据类型的转换的模块,它使得流的操作变得非常简单,完美解决了Python没有字节数据类型的尴尬。
注意我们这里说的字节串可以是这样的

#其中\x代表的就是
str=b'\x00\x12'

struct.pack

作用:Python数据类型 ——> “字节串”
格式:struct.pack(format, v1, v2, …)

struct.unpack

作用:“字节串” ——> Python数据类型
格式:struct.unpack(format, buffer)

format:格式

  1. 对齐方式

image.png

  1. 格式字符

image.png

payload=b'\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12'
# 大端,按照协议规定的字节数,进行解码。这部分的四个字节进行解码
msg_length = struct.unpack('>i',payload[1:5])[0]
# 大端,按照协议规定的字节数,进行解码。这部分的2个字节进行解码
msg_id = struct.unpack('>H', payload[9:11])[0]

大端与小端

为什么会出现大小端?

因为计算机内部存储数据的方式不同

什么是大小端

大端: 首先明确一点就是他与我们的阅读习惯是一致的,在书本上,我们是从左往右来看数字的,这个不牵扯到存储。
例如 0x0102 十六进制进制数,其实这就是大端存储。将01这个数据的高字节存储到内存的底地址中
小端:
例如 0x0201 十六进制进制数,其实这就是小端存储。将01这个数据的高字节存储到底地址中

引用 :https://blog.csdn.net/Robin_Pi/article/details/112233764

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐