社区
Linux/Unix社区
帖子详情
结构体和网络字节序问题
大耳
2006-04-29 08:46:37
typedef struct STag{
char a0;
char aa[4];
unsigned short a1;
unsigned short b;
unsigned short c;
int d;
float e;
double f;
char *g;
int *h;
}S;
linux下,
上面这个结构要通过网络传输出去,问如何处理结构填充空洞和网络字节序。
如果哪位 高手能写出大致的伪代码 ?
3x
...全文
572
15
打赏
收藏
结构体和网络字节序问题
typedef struct STag{ char a0; char aa[4]; unsigned short a1; unsigned short b; unsigned short c; int d; float e; double f; char *g; int *h; }S; linux下, 上面这个结构要通过网络传输出去,问如何处理结构填充空洞和网络字节序。 如果哪位 高手能写出大致的伪代码 ? 3x
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
fierygnu
2006-04-29
打赏
举报
回复
* 如果没有对齐,在发送的时候会不会把空洞里面的数据发出去呢?
===
会。send不区分结构,只是当作字节流。
* 浮点型呢怎么办?
===
也需要转换。到网上搜一下,有转换函数库。
fierygnu
2006-04-29
打赏
举报
回复
没找到为什么结贴了?:)
http://schwehr.org/software/density/
大耳
2006-04-29
打赏
举报
回复
现在问题是
* 如果没有对齐,在发送的时候会不会把空洞里面的数据发出去呢?
* 浮点型呢怎么办?
S.f = htonl((unsigned long)f); //这样就可以了?但是把double f变成unsigned long会不会使数据出错
高手帮忙看看,我也马上试验下看
大耳
2006-04-29
打赏
举报
回复
或者
toSend[0] = S.a0; // char a0;
toSend[1] = aa[0]; //char aa[4];
...
toSend[6] = htons(a1); // ; 这里强制转换,会自动把a1的低位放到toSend[7]??
或者再定义一个
S.a1 = htons(a1); 然后发送S=====这样似乎比较好,
但是
浮点型呢怎么办?
S.f = htonl((unsigned long)f); //这样就可以了?但是把double f变成unsigned long会不会使数据出错?
大耳
2006-04-29
打赏
举报
回复
如果没有对齐,在发送的时候会不会把空洞里面的数据发出去呢?
考虑移植性,应该使用htonl等函数,就是说,要另外建立一个数组,然后把结构一个一个的处理后,填入?
S myS;
unsigned char toSend[sizeof(S)]; // 这个sizeof得到的会比我要发的数据大呀?
然后
toSend[0] = S.a0; // char a0;
toSend[1] = aa[0]; //char aa[4];
...
toSend[6] = a1 // unsigned short a1; 这里强制转换,会自动把a1的低位放到toSend[7]??
// 或者用 toSend[6] = a1 & 0xff;
// toSend[7] = (a1>>8) & oxff;
.
.
.
x86
2006-04-29
打赏
举报
回复
如果你的所有机器的系统都是一样的,也就是肯定没有字节序不一致的情况,可以不考虑字节序的问题(比如如果都是x86体系,就不用考虑)。否则就需要对每个结构成员调用htonl或者ntohl函数在网络字节和本地字节之间转换。
x86
2006-04-29
打赏
举报
回复
你可以把char和short都换成int,就可以对齐了。或者char后面加上一个char reserved[3]凑齐4字节。
大耳
2006-04-29
打赏
举报
回复
ps 系统存储器是4字节对齐的
大耳
2006-04-29
打赏
举报
回复
还是不行哎~~~
调用htonf 时必须把参数强制转换为unsigned long,
这样做和调用htonl没什么区别了,
所以可是 (unsigned long )0.5 ===> 0
好郁闷呀
fierygnu
2006-04-29
打赏
举报
回复
浮点数的格式虽然有IEEE标准,但不是大家都用。
大耳
2006-04-29
打赏
举报
回复
呵呵,找到了,多谢多谢
#define htonf(x) (endian()?(x):swapf(x))
static int
endian()
{
static int init = 0;
static int endian_value;
char *p;
if (init) return endian_value;
init = 1;
p = (char*)&init;
return endian_value = p[0]?0:1;
}
#ifndef swap32
#define swap32(x) ((((x)&0xFF)<<24) \
|(((x)>>24)&0xFF) \
|(((x)&0x0000FF00)<<8) \
|(((x)&0x00FF0000)>>8) )
#endif
其实是自己做字节调换,
只是奇怪 这么重要的函数为什么不是 系统函数,
fierygnu
2006-04-29
打赏
举报
回复
呵呵,怎么搜的?google htonf
大耳
2006-04-29
打赏
举报
回复
不过可以肯定的是不能调用htonl来处理浮点型。我试过了,类型转换时,都变成了0 :(
大耳
2006-04-29
打赏
举报
回复
关键是浮点型麻烦, fierygnu(va_list) 大虾说的库没有找到。。。。。失败
tb01412(tb) 说人为调换,对于整形时可以的,但是对于浮点型我要验证下看
tb01412
2006-04-29
打赏
举报
回复
1.用紧凑格式的结构体定义
2.将每个非char类型的成员取出后转成网络字节序然后再发送出去
3.接收到之后将先存临时的结构体中,将所有非CHAR类型的成员转换成本地字节序
只要是一个字节以上的数据结构,都存在字节序的问题,为了简化处理,有一个笨办法,就是将每个非char类型的成员拷到临时变量中,然后再取这个变量地址,如果是PC机,也就是小端字节序,网络是大端字节序,只需操作这个内存地址,将这个内存地址中的数据按char类型调个头,就OK了,接收端在收到后就执行相反的操作,这就是人为地进行字节序转换,无论是整型,浮点型还是其它类型的转换过程都是一样
利用串口传输
结构体
数据
写在前面: 本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自
网络
、书籍、和各类手册,如若侵权请告知,马上删帖致歉。 一、涉及到的知识点 C语言
结构体
大小及对齐
问题
字节序
(Endianness):大端和小端 二、应用
结构体
是一种数据的归类方式,相比数组或变量更具有整体全面性,例如一个数组只可以放一些按照元素顺序存放的单元变量,即 buffer = {x, x, x, x, x…},i 有多大,数组内元素就有多少。那么我们这时候如果我们用这个数组来接收串口接收信息,信息的格式是: 数据头 ->数据长度 ->数据区 ->数据校验 ->数据尾 假设数据
【Linux】主机
字节序
和
网络
字节序
(一)
问题
提出:为什么要有主机
字节序
和
网络
字节序
的存在? 现在大多数PC机器都是小端
字节序
(小端存储),也称为主机
字节序
;但不排除有大端PC机器的存在。 若在两台
字节序
不同的主机上传输数据时,接收端将会错误解释。 例如:小端主机发送0x0001(2字节的十进制数据1)给大端机器接收到并处理之后的数据就是0x0100(2字节十进制数据256),很明显数据输出被错误的解释。 所以解决
问题
的方法:发送端总是把发送的数据转化成大端
字节序
(
网络
字节序
)后再发送,接收端知道对方的数据采用大端
字节序
,接收端根据
结构体
和字节转换
今天没干啥,就看了一个
结构体
和字节之间转换的方法,主要是方便
网络
通信,因为
网络
通信以字节的形式传送。Soso………… 本编主要内容如下: 1、 托管和非托管的区别? 2、
结构体
和字节间转换思路? 3、 代码罗列 分割线、分割线、分割线………………………………………………………………………… 第一个
问题
: 托管和非托管区别? 托管代码(managed cod
C++宏的黑科技用法《
结构体
字节序
自动转换》
背景 慢慢的自己管理项目已经一年了,这也是我管理的第一个项目,期间触及了挺多的知识盲区,开始慢慢的摸索,慢慢的熟悉,将压力转化为了动力。我在这里想总结下作为新人的我在这一年里收获了什么。 开始优化 可能源于自己管理项目,我开始放飞自我,但凡自己感觉看不顺眼的地方就改改改(还好没改出什么大
问题
出来)。开始每优化一个代码我都会反复去测,生怕出
问题
。通过不同的写法来简化代码,期间用的最多的应该是宏吧!这...
结构体
和字节流转换
结构体
和字节流转换
Linux/Unix社区
23,110
社区成员
74,506
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章