首页 > 其他分享 >socket通信中的大小端问题及解决措施

socket通信中的大小端问题及解决措施

时间:2024-09-23 10:47:23浏览次数:1  
标签:socket int buf 通信 内存 大小 0x12345678 数据

本人一直有个疑惑,大小端通信怎么存储(以前一直知道这个概念,但怎么都跟实际匹配不上,网络上也并没有说怎么处理大小端通信问题)

socket通信中 addr 需要转换成网络字节序,也就是大端

助记: htonl h-> host 缩写 n -> net 缩写 l 是类型缩写(l -> long  ll-> longlong s short 都是无符号的)

首先理解下,大小端  数据在内存的存储顺序不同,注意数据还是那个数据,只是存储的方式不同。

大端,数据的低位在内存的高位

小端,数据的低位在内存的低位

内存地址是按字节排序的 0x01 0x02 每个地址偏移是一个字节的内容。

数据 0x12345678  数据的从低到高 0x78 0x56 0x34 0x12.

大端 内存内数据 0x01-0x12 0x02-0x34 0x03-0x56 0x04-0x78

小端 内存内数据 0x01-0x78 0x02-0x56 0x03-0x34 0x04-0x12

socket传输的是字节流,byte[] 数组,我们分两种情况讨论 unsigned int var=0x12345678; 在网络中的传输状态。

1.两端 大小端 一致,则直接使用memcpy就可以,memcpy是内存数据的 大端会变成 0x12345678 数据传输到对端,把数据copy到内存中也是 0x12345678, 小端是 0x78563412, copy 到本地 也是这个值,毫无影响。

2.两端 大小端 不一致,变成byte数据的时候,memcpy是内存数据的 大端会变成 0x12345678 数据传输到对端,把数据copy到内存中也是 0x12345678,  这时cpu按内存地址认为值的话, 并不等于 数据0x12345678. 所以解析错误。小端同理。

解决办法,所以在socket传输多字节数据的情况下,需要把内存数据转为数据顺序(自定义的,可以从高到低,也可以从低到高,但是发送端和解析端必须一致)

1 char * writeInt32(int v) {
2     char *buf = new char[4];
3     buf[0] = (v >> 24) & 0xFF;
4     buf[1] = (v >> 16) & 0xFF;
5     buf[2] = (v >> 8) & 0xFF;
6     buf[3] = (v >> 0) & 0xFF;
7 
8    return buf;
9 }
1 int readInt32(char[] buf) {
2     int ch1 = buf[0];
3     int ch2 = buf[1];
4     int ch3 = buf[2];
5     int ch4 = buf[3];
6     return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
7 }

通过上述write32()和readInt32()之后,每次接收方或者发送方都以byte字节进行读写,就可以保证socket两端数据保持一致性,避免了大小端问题。

【补充】

大小端出现的原因:两台设备之间的cpu架构不同,导致数据存储时有些设备使用大端存储(PowerPC系列是采用大端存储模式的典型代表。),有些设备采用小端存储(x86系列)

转载至:https://www.cnblogs.com/zijian-yang/p/15821625.html

标签:socket,int,buf,通信,内存,大小,0x12345678,数据
From: https://www.cnblogs.com/xaio-lis/p/18426607

相关文章

  • 怎么用ROS节点建立通信
    目录1.安装并初始化ROS2.创建ROS工作空间3.创建节点3.1.C++实现创建发布者节点(Publisher)创建订阅者节点(Subscriber)编译代码运行节点3.2.Python实现创建发布者节点(Publisher)创建订阅者节点(Subscriber)运行Python节点4.检查节点与话题在ROS(RobotOperatingS......
  • qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed加
    qDebug()<<"QSslSocket="<<QSslSocket::sslLibraryBuildVersionString();qDebug()<<"OpenSSL支持情况:"<<QSslSocket::supportsSsl();打印需要的版本和当前openssl的支持情况如果显示false,不支持就是说明,不支持加密对应下载版本的openssl进行重新编译即可原因......
  • pgsql 查看日志文件大小、数据目录、运行日志相关配置、当前lsn
    常用命令  查看数据目录 showdata_directory; 是否开启归档 showarchive_mode;  --查看日志目录所有文件select*frompg_ls_logdir();--查看/data目录下的文件selectpg_ls_dir('/data'); 输出数据库WAL目录的所有文件--输出文件总大小,单位是byte  select......
  • WebSocket相关知识点
    文章目录一、数据实时推送实现1.轮询(Polling)2.长连接(LongPolling)3.WebSocket二、代码实现后端实现1.引入依赖2.配置类3.WebSocket服务类4.定时任务前端实现测试工具推荐三、常见错误及解决方案错误1:参数缺失或注解错误错误2:遍历集合时修改集合导致的并......
  • Linux 中sed命令实现大小写的转换
     001、大写转换为小写[root@PC1test]#lsa.txt[root@PC1test]#cata.txt##测试数据abcDEFHIKLmnOpqM[root@PC1test]#sed's/[A-Z]/\L&/g'a.txt##所有的大写转换为小写abcdef......
  • 电脑串口和手机蓝牙BLE串口数据包通信调试工具
    1,支持HEX收发2,支持文本收发3,支持自定义按钮发送自定义命令和数据包4,支持自定义解析包内任意位置1~4字节转int并显示5,自定义json举例说明[{"name":"1234命令","type":"button","cmd":"1234","data":"01020304"},{"name":"1......
  • vue3常用的组件间通信
    一propsprops可以实现父子组件通信,props数据是只读。1.基本用法在父组件中,你可以这样传递props:<template><ChildComponentmessage="Hello,Vue3!"/></template><scriptsetup>importChildComponentfrom'./ChildComponent.vue';</scrip......
  • Can't connect to local MySQL server through socket
    mysql-urootERROR2002(HY000):Can'tconnecttolocalMySQLserverthroughsocket'/tmp/mysql.sock'(2)这是mysql登录时找不到套接字的问题。首先需要明白的是,Linux端的mysqlserver启动时会开启一个socket,Linux上的MySQL的客户端在不使用IP连接时mysqlserver时,默认......
  • Python 中的 Socket 编程入门
    Python中的Socket编程入门Socket编程是网络编程的重要组成部分,允许计算机通过网络进行通信。在Python中,使用内置的socket模块,开发者可以轻松地实现客户端和服务器之间的交互。本文将详细介绍Python中的Socket编程,包括基本概念、常用操作、TCP和UDP通信的实......
  • GPU与国产芯片异构通信方案,异构万卡集群 初步调研
    视频分享在这:3.1异构万卡集群,GPU与国产计算卡芯片异构通信_哔哩哔哩_bilibili国内已经有三家,实现了异构集群,GPU与国产芯片异构通信方案,初步调用结果如下。异构集群的挑战异构芯片间的混训主要面临两大挑战,一是异构卡通信库差异,导致异构卡之间通信难,二是异构卡之间性能差异......