【计算机网络】TCP中payload的解析,在python中的体现?字节、字符?为啥字节用十六进制表示?

编码

问题来源

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

  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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秀才大大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值