Python - 网络传输数据格式【字节流】传输优点及数据格式【字符,字典,字节,二进制,十六进制】的转换

一. 前言

在网络传输数据时,数据本质上是以二进制形式进行传输的。无论是传输字节还是传输二进制数据,最终都会转化为二进制进行传输。

所以,从传输速度的角度来看,无论是传输字节还是传输二进制数据,实际上是相同的,没有本质区别。传输速度的快慢主要取决于网络连接的带宽、延迟等因素,而不是数据格式的选择。

在一些特定的应用场景下,可能会使用特定的数据格式进行传输。例如,如果传输的是文本信息,可以选择使用字节流传输;如果传输的是图像或音频等二进制数据,可以选择使用二进制流传输。但这些选择更多是基于数据的特点和处理需求,而不是为了提高传输速度。

二. 各个数据大小测试代码

在Python中,可以使用sys.getsizeof()函数来计算一个对象的大小(以字节为单位)。

  • 使用json.dumps()将字典转换为字符串
  • 使用.encode()方法将字符串转换为字节
  • 使用binascii.hexlify()将字节转换为十六进制
  • 使用pickle.dumps()将字典转换为二进制
import json
import pickle
import sys
import binascii# 示例字典
data = {'name': 'John','age': 30,'city': 'New York','角色': '工程师',}def calculate_size(data):# 字典转换为字符json_str_data = json.dumps(data, ensure_ascii=False)json_str_size = sys.getsizeof(json_str_data)# 字典转换为字节byte_data = json_str_data.encode('utf-8')byte_size = sys.getsizeof(byte_data)# 字典转换为十六进制hex_data = binascii.hexlify(byte_data)hex_size = sys.getsizeof(hex_data)# 字典转换为二进制binary_data = pickle.dumps(data)binary_size = sys.getsizeof(binary_data)print(f'dict -> str:{json_str_data}')print(f'dict -> bytes:{byte_data}')print(f'dict -> hex:{hex_data}')print(f'dict -> binary:{binary_data}')res = {'data': {'json_str_data': json_str_data,'byte_data': byte_data,'binary_data': binary_data,'hex_data': hex_data,},'size': {'json_str_size': json_str_size,'byte_size': byte_size,'binary_size': binary_size,'hex_size': hex_size,},}return resdef str2dict(str_data):# 将JSON字符串转换为字典my_dict = json.loads(str_data)return my_dictdef hex2dict(hex_data):# 将十六进制字符串转换为字节串bytes_str = binascii.unhexlify(hex_data)# 将字节串转换为JSON字符串json_str = bytes_str.decode()# 将JSON字符串转换为字典my_dict = json.loads(json_str)return my_dictdef binary2dict(binary_data):# 将二进制数据转换为字典my_dict = pickle.loads(binary_data)return my_dictdef bytes2dict(bytes_data):# 将字节流数据转换为字典my_dict = bytes_data.decode('utf-8')return my_dictif __name__ == '__main__':# 计算大小res = calculate_size(data)print("\n====================\n")print("字典大小:", sys.getsizeof(data))print("字符大小:", res['size'].get('json_str_size'))print("字节大小:", res['size'].get('byte_size'))print("二进制大小:", res['size'].get('binary_size'))print("十六进制大小:", res['size'].get('hex_size'))print("\n====================\n")print("str to dict:", str2dict(res['data'].get('json_str_data')))print("bytes to dict:", bytes2dict(res['data'].get('byte_data')))print("hex to dict:", hex2dict(res['data'].get('hex_data')))print("binary to dict:", binary2dict(res['data'].get('binary_data')))

运行结果
在这里插入图片描述
从以上运行结果可以看出,使用转换后字节的大小是最小的,因此常用其作为网络数据传输的格式,一般来说,网络传输数据时推荐使用字节进行表示和计算传输速度。这是因为网络传输通常以字节为单位,而且字节更直接地与计算机系统的存储和传输操作相关联。使用字节作为传输单位更加直观和符合实际。

附上其他数据之间转换的方法

import binascii
import structdef example(express, result=None):if result == None:result = eval(express)print(express, '==>', result)if __name__ == '__main__':print('整数之间的进制转换:')print('10进制转16进制', end=':')example("hex(16)")print("16进制结10进制", end=':')example("int('0x10', 16)")print("类似的还有octO, bin()")print("\n-------------------\n")print("字符串转整数:")print("10进制字符串", end=": ")example("int('10')")print("16进制字符串", end=": ")example("int('10', 16)")print("16进制字符串", end=": ")example("int('0x10', 16)")print("\n-------------------\n")print('字节串转整教:')print("转义为short型整数", end=": ")example(r"struct.unpack('< hh', bytes(b'\x01\x00\x00\x00'))")print("转义为1ong型整教", end=": ")example(r"struct.unpack('< L', bytes(b'\x01\x00\x00\x00'))")print("\n====================\n")print("整数转字节串: ")print("转为两个字节", end=": ")example("struct.pack('<HH',1,2)")print("转为四个字节", end=": ")example("struct.pack('<LL',1,2)")print("\n-------------------\n")print('字符串装字节串:')print('字符串编码为字节码', end=": ")example(r"'12abc'.encode(' ascii')")print('数字或字符数组', end=": ")example(r"bytes([1, 2,ord('1'), ord('2')])")print('16进制字符串', end=': ')example(r"bytes().fromhex('010210')")print('16进制字符串', end=': ')example(r"bytes(map(ord,'\x01\x02\x31\x32'))")print('16进制数组', end=': ')example(r'bytes([0x01, 0x02, 0x31, 0x32])')print("\n====================\n")print("字节串转字符串:")print('字节码解码为字符串', end=": ")example(r"bytes(b'\x31\x32\x61\x62').decode('ascii')")print('字节出传16进制表示,夹带ascii', end=": ")example(r"str(bytes(b'lx01\x0212'))[2:-1]")print('字节串转16进制表示, 固定两个字符表示', end=": ")example(r"str(binascii.b2a_hex(b'\x01\x0212'))[2:-1]")print("\n====================\n")

=========================================
运行结果

整数之间的进制转换:
10进制转16进制:hex(16) ==> 0x10
16进制结10进制:int('0x10', 16) ==> 16
类似的还有octO, bin()-------------------字符串转整数:
10进制字符串: int('10') ==> 10
16进制字符串: int('10', 16) ==> 16
16进制字符串: int('0x10', 16) ==> 16-------------------字节串转整教:
转义为short型整数: struct.unpack('< hh', bytes(b'\x01\x00\x00\x00')) ==> (1, 0)
转义为1ong型整教: struct.unpack('< L', bytes(b'\x01\x00\x00\x00')) ==> (1,)====================整数转字节串: 
转为两个字节: struct.pack('<HH',1,2) ==> b'\x01\x00\x02\x00'
转为四个字节: struct.pack('<LL',1,2) ==> b'\x01\x00\x00\x00\x02\x00\x00\x00'-------------------字符串装字节串:
字符串编码为字节码: '12abc'.encode(' ascii') ==> b'12abc'
数字或字符数组: bytes([1, 2,ord('1'), ord('2')]) ==> b'\x01\x0212'
16进制字符串: bytes().fromhex('010210') ==> b'\x01\x02\x10'
16进制字符串: bytes(map(ord,'\x01\x02\x31\x32')) ==> b'\x01\x0212'
16进制数组: bytes([0x01, 0x02, 0x31, 0x32]) ==> b'\x01\x0212'====================字节串转字符串:
字节码解码为字符串: bytes(b'\x31\x32\x61\x62').decode('ascii') ==> 12ab
字节出传16进制表示,夹带ascii: str(bytes(b'lx01\x0212'))[2:-1] ==> lx01\x0212
字节串转16进制表示, 固定两个字符表示: str(binascii.b2a_hex(b'\x01\x0212'))[2:-1] ==> 01023132====================

三. 总结

总结起来,网络传输数据时,

  • 无论是字节传输还是二进制传输,传输速度是相同的,可以根据实际需求选择适合的数据格式进行传输。
  • 数据是以二进制的形式进行传输,但以字节为单位进行表示和计算传输速度更为常见和推荐。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/277136.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

光学镜头市场研究:预计2029年将达到460亿元

随着终端产品应用领域的不断拓宽和深化&#xff0c;未来光学镜头设计和生产技术的重点是提高成像质量、增加功能并缩小体积。具体而言&#xff0c;光学镜头产品技术在不同的应用领域正呈现出不同的特点。如在数字安防领域&#xff0c;随着视频监控技术应用范围和场景的逐步扩展…

Python自动化测试(unittest框架)

一、什么是框架 框架是由大佬开发或者专业的研发团队研发的技术骨架&#xff0c;框架是一个半成品&#xff0c;框架是对常用的功能&#xff0c;基础的代码进行封装的一个工具&#xff0c;这个工具对外提供了一些API&#xff0c;其他的开发者只需要调用框架的接口即可&#xff…

聚焦生成式AI,从基石到平台到应用,亚马逊云科技火力全开

引言&#xff1a;在迈向生成式AI的道路上&#xff0c; 云厂商的行业声音越来越大…… 【全球云观察 &#xff5c; 科技热点关注】 2023年全球科技行业最火的莫过于生成式AI&#xff0c;即Artificial Intelligence Generated Content。在迈向生成式AI的道路上&#xff0c;虽然…

【加锁 】

文章目录 锁 理论部分锁的原理锁的应用 --- 封装 锁 理论部分 定义锁的两种方案 1.定义全局锁 直接在全局用 pthread_mutex_t mutex PTHREAD_MUTEX_INITIALIZER; 就不用再 init 和 destroy 了。 2.定义局部锁 pthread_mutex_init pthread_mutex_t 是库提供的一种数据类型 第二…

Docker 学习不再难:这些网站让你轻松掌握容器技术!

介绍&#xff1a;Docker是一个开源的应用容器引擎&#xff0c;基于Go语言并遵从Apache2.0协议开源。它可以让开发者将他们的应用及依赖打包到一个轻量级、可移植的容器中&#xff0c;进而发布到任何流行的Linux或Windows操作系统的机器上&#xff0c;同时也可以实现虚拟化。 Do…

certum ev ssl证书1180元一年,360浏览器显示公司名

Certum旗下的EV SSL证书是审核最严的数字证书&#xff0c;不仅对网站传输数据进行加密&#xff0c;还可以对网站身份进行验证&#xff0c;除此之外&#xff0c;它独有的绿色地址栏提升了网站的真实性&#xff0c;增强了客户对网站的信任感。今天就随SSL盾小编了解Certum旗下的E…

中国制造MES市场分析

据了解&#xff0c;作为制造业企业数字化转型的核心&#xff0c;制造执行系统是打通IT和OT&#xff0c;将运营和生产数据融合的关键通道。在工业元宇宙、数字孪生、智能制造、工业4.0、CPS等概念之下&#xff0c;MES在务实的制造业中需求明确、价值清晰&#xff0c;是制造业企业…

关东升老师从小白到大牛系列丛书(由清华大学出版社出版)

助力技术成长&#xff0c;成就大牛之路 在这个科技日新月异的时代&#xff0c;掌握一门编程语言或专业技能已是必备&#xff0c;不再是奢侈。清华大学出版社出版的“从小白到大牛”的系列丛书&#xff0c;涵盖Python、Java、Kotlin、Android和SQL&#xff0c;助你快速在技术之…

前端自定义icon的方法(Vue项目)

第一步&#xff1a;进入在线的编辑器进行设计 好用&#xff1a;百度字体编辑器 比如先导入有个ttf文件 添加新字体 双击每个模块进入编辑区域 更改相应的信息&#xff0c;比如name 编辑完了进行导出文件(各种格式就行了)就行了 第二步&#xff1a;在项目中asset文件储存这些文…

当你打开终端并输入命令时会发生什么?(下)

哈喽大家好&#xff0c;我是咸鱼 我们先来大致回顾一下文章《当你打开终端并输入命令时会发生什么?&#xff08;上&#xff09;》的内容 终端设备是由电传打字机演变过来的&#xff0c;电传打字机通过物理线与大型计算机连接在一块来实现输入输出 如上图&#xff0c;分别是二…

vue el-cascader组件change失效以及下拉框不消失的问题

文章目录 1.前言2. 碰到的问题3. 如何解决这两个问题 1.前言 最近项目上用到el-cascader这个组件,需要可以选第一级菜单&#xff0c;也需要可以选第二级菜单&#xff0c;点击完成之后需要关闭下拉框。其实功能比较简单&#xff0c;找了很多资料&#xff0c;没有找到合适的方案…

三层交换,DHCP的详解与VRRP

目录 一、三层交换 1、三层交换机的作用&#xff1a; 2.vlan的虚拟接口vlanif&#xff08;ifinterface接口&#xff09; 3.三层交换机实验 4.拓展实验​编辑 二、DHCP 1.自动获取ip地址&#xff1a; 2.DHCP的好处&#xff1a; 3.分配方式&#xff1a; 4.举例&#xff…