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

news2024/9/26 1:19:05

一. 前言

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

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

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

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

在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 res


def str2dict(str_data):
    # 将JSON字符串转换为字典
    my_dict = json.loads(str_data)
    return my_dict


def hex2dict(hex_data):
    # 将十六进制字符串转换为字节串
    bytes_str = binascii.unhexlify(hex_data)
    # 将字节串转换为JSON字符串
    json_str = bytes_str.decode()
    # 将JSON字符串转换为字典
    my_dict = json.loads(json_str)
    return my_dict


def binary2dict(binary_data):
    # 将二进制数据转换为字典
    my_dict = pickle.loads(binary_data)
    return my_dict


def bytes2dict(bytes_data):
    # 将字节流数据转换为字典
    my_dict = bytes_data.decode('utf-8')
    return my_dict


if __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 struct


def 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.coloradmin.cn/o/1314944.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenHarmony关于修改系统横屏导致启动视频显示不全问题解决

前言 OpenHarmony源码版本&#xff1a;4.0release 开发板&#xff1a;DAYU / rk3568 前段时间写的设置OpenHarmony启动视频&#xff0c;在竖屏状态下是正常的&#xff0c;但是横屏状态下显示不全。 链接直达&#xff1a;OpenHarmony 设备启动Logo和启动视频替换指南-CSDN博…

.net 洋葱模型

洋葱架构 内层部分比外层更抽象(内层接口&#xff0c;外层实现)。外层的代码只能调用内层的代码&#xff0c;内层的代码可以通过依赖注入的形式来间接调用外层的代码 简单的例子&#xff0c;引用依赖图 demo 接口类库 EmailInfo using System; using System.Collections.…

基于ssm一中体育馆管理系统的设计与实现论文

镇赉县一中体育馆管理系统的设计与实现 摘要 随着信息互联网购物的飞速发展&#xff0c;一般有能力的机构管理系统。本文介绍了镇赉县一中体育馆管理系统的开发全过程。通过分析企业对于镇赉县一中体育馆管理系统的需求&#xff0c;创建了一个计算机管理镇赉县一中体育馆管理…

瞳孔检测眼动追踪python实现(基于dlib)

效果展示&#xff1a; 原图&#xff1a;&#xff08;图片来自 b站up 借我300去洗牙&#xff09; dlib实现的特征点检测 瞳孔检测结果 完整代码&#xff1a; # encoding:utf-8import dlib import numpy as np import cv2def rect_to_bb(rect): # 获得人脸矩形的坐标信息x …

鸿蒙实操【ArkTS语言的运用】

ArkTS基础知识 使用声明式语法和组件化基础知识&#xff0c;搭建一个可刷新的排行榜页面。在排行榜页面中&#xff0c;使用循环渲染控制语法来实现列表数据渲染&#xff0c;使用Builder创建排行列表布局内容&#xff0c;使用装饰器State、Prop、Link来管理组件状态。最后我们点…

Linux Conda 安装 Jupyter

在Linux服务器Conda环境上安装Jupyter过程中遇到了无数的报错&#xff0c;特此记录。 目录 步骤一&#xff1a;安装Anaconda3 步骤二&#xff1a;配置Conda源 步骤三&#xff1a;安装Jupyter 安装报错&#xff1a;simplejson.errors.JSONDecodeError 安装报错&#xff1a;…

循环神经网络-1

目录 1 数据集构建 1.1 数据集的构建函数 1.2 加载数据并进行数据划分 1.3 构造Dataset类 2 模型构建 2.1 嵌入层 2.2 SRN层 2.3 线性层 2.4 模型汇总 3 模型训练 3.1 训练指定长度的数字预测模型 3.2 多组训练 3.3 损失曲线展示 4 模型评价 总结 参考文献 循环神经网络&…

VC++项目的32位、64位的配置和链接问题

新建一个项目&#xff0c;默认是x86配置&#xff1b; 添加包含目录、库目录&#xff0c;之后可以编译通过&#xff1b; 但是链接会出错&#xff0c;因为链接的dll是64位&#xff1b; 把项目配置改为x64&#xff1b; 需要把包含目录和库目录针对x64重新添加&#xff0c;否则会…

获取CAD图元名及图元信息(circle为例,用于选择集,对应dxf组码)

在CAD编程中往往需要用选择集&#xff0c;我们往往不知道相应图元对应的名称具体名字。比如我想选择所有的圆&#xff0c;ftype0,fdata应该是什么呢&#xff1f;是circle&#xff0c;acdbcircle&#xff0c;还是acadcircle? circle是一个对象&#xff0c;circle的vba类名为Ac…

【CSS】用 CSS 写一个渐变色边框的输入框

Using_CSS_gradients MDN 多渐变色输入框&#xff0c;群友问了下&#xff0c;就试着写了下&#xff0c;看了看 css 渐变色 MDN 文档&#xff0c;其实很简单&#xff0c;代码记录下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta ch…

【unity小技巧】两种办法解决FPS游戏枪或者人物穿墙穿模问题

文章目录 前言第一种解决思路第二种方法总结感谢完结 前言 当我们开发FPS游戏时&#xff08;其实3d游戏基本都会遇到这样的问题&#xff09;&#xff0c;如果我们不做处理&#xff0c;肯定会出现人物或者枪的穿墙穿模问题&#xff0c;这是是一个常见的挑战。 这种问题会破坏…

Flink窗口的概念和分类

窗口的概念 Flink是一种流式计算引擎&#xff0c;主要是来处理无界数据流的&#xff0c;数据源源不断、无穷无尽。想要更加方便高效地处理无界流&#xff0c;一种方式就是将无限数据切割成有限的“数据块”进行处理&#xff0c;这就是所谓的“窗口”&#xff08;Window&#x…

指针相关知识(进阶)

前面的入门中已经介绍了指针的基础知识&#xff0c;接下来&#xff0c;让我们继续学习吧&#xff01; 一. 字符指针变量 char* 一般形式 int main() {char n w;char* pa &n;*pa w;return 0; } 这并不是把字符串hello world放在n中&#xff0c;而是把第一个字符的地址…

【论文解读】System 2 Attention提高大语言模型客观性和事实性

一、简要介绍 本文简要介绍了论文“System 2 Attention (is something you might need too) ”的相关工作。基于transformer的大语言模型&#xff08;LLM&#xff09;中的软注意很容易将上下文中的不相关信息合并到其潜在的表征中&#xff0c;这将对下一token的生成产生不利影响…

LeetCode day24

LeetCode day24 今天主打一个快乐happy(▽ʃ♡ƪ)&#xff0c;主要是今天写哈夫曼树被经典文件读取坑麻了&#xff08;为啥绝对路径能读取&#xff0c;相对不行。罢了&#xff09; 一个中等题&#xff0c;但是咋感觉很小学捏。。。 2177. 找到和为给定整数的三个连续整数 相…

320科技工作室ZEMAX培训通知

一 软件介绍 ZEMAX是一套综合性的光学设计软件。它提供先进的、且符合工业标准的分析、优化、公差分析功能&#xff0c;能够快速准确的完成光学成像及照明设计。 二 培训方式 本次培训全程线上授课, 采用一对一或者一对多方式进行, 以视频方式授课&#xff0c;工程案例讲解&…

自动化测试(三)webdriver的常用api(1)

目录 等待 sleep休眠 隐式等待 显式等待 打印信息 打印title 打印url 浏览器的操作 浏览器最大化 设置浏览器宽、高 操作浏览器的前进、后退 控制浏览器滚动条 键盘事件 键盘按键用法 键盘组合键用法 鼠标事件 定位一组元素 前面两章我们讲了selenium环境的…

初识JVM底层知识,一文读懂JVM知识文集。

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

基于ssm医用物理学实验考核系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本医用物理学实验考核系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数…

什么是前端国际化(internationalization)和本地化(localization)?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…