编码
问题来源
最近要根据一份国家标准协议进行解码,但是对于进制,字节,字符,编码,转码有比较多的问题。其中我想实现的主要需求如下:
- 有客户端与服务端,进行tcp通信,客户端要发送一个请求,tcp中payload请求大概是这样,有很多个十六进制表示的字节组成
- 根据协议的规定,从中间取出某几个字节进行编码 ,比如第五个位置-第六个位置,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:格式
- 对齐方式
- 格式字符
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://www.toymoban.com/news/detail-501118.html
引用 :https://blog.csdn.net/Robin_Pi/article/details/112233764文章来源地址https://www.toymoban.com/news/detail-501118.html
到了这里,关于【计算机网络】TCP中payload的解析,在python中的体现?字节、字符?为啥字节用十六进制表示?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!