读书人

关于字符串转结构体如何定义这个结构

发布时间: 2013-09-11 16:26:28 作者: rapoo

关于字符串转结构体,怎么定义这个结构体的问题。
刚接触网络通讯行业,经常看到这样类型的语句,
比如unsigned char* rev_buf;

rev_buf[12] = 0x00;
rev_buf[4]*256 + rev_buf[5];
rev_buf[10]*256 + rev_buf[11] - 1;
rev_buf[0x1a + 0x08] = 0x00;等诸如此类的语句,这个含义到底是什么?

如果说我要定义一个结构体来将rev_buf强制转换成结构体类型,我又要怎么去构建这个结构体。

typedef struct{
?
}
REV_STRUCT;

用的时候可以这样:

REV_STRUCT *ptr ;
ptr = (REV_STRUCT*)rev_buf; 求高手解答。。。

就是说: 用ptr指针的形式 替换 rev_buf[]里面的东西。 比如ptr指针形式替换 rev_buf[4]*256 + rev_buf[5],我在结构体中需要怎么定义?

谢谢各位大侠了。刚刚接触这个行业... 所以问了些奇怪的问题或者比较低级的问题 请不要见怪!:P

[解决办法]
楼主看来刚接触,确实不了解这些,不过总体来说不要纠结,如果做这个行业,就会慢慢知道。下面我说一下楼主的几个疑问。
>>1.如果说我要定义一个结构体来将rev_buf强制转换成结构体类型,我又要怎么去构建这个结构体。
我想说的是,这些rev_buf表示接收的数据缓冲,也就是接收数据的数组,无法定义一个结构体来讲rev_buff强制转换。为啥呢不能定义这样的一个结构体呢,试想一下,定义一个结构体,这个结构体的各个变量基本是不变的,可能会问,接收的网络数据一般是ip/tcp,udp/data这样的数据,也是tcp/ip网络模型的形式。我定义一个这样的结构体不行吗
struct Mybuff
{
IP ip;
tcp tcp/udp...
dat data
},其实这样也是不行,因为ip,tcp,data都是变长的。但不是关键,解析网络数据时,其实有点像串行的解析,根据IP这块buff解析的结果确定下一层的数据是Tcp,udp或者其他的数据。
所以说不是不想定义这样的结构,就是没有这样的结构能表示网络数据的形式。
[解决办法]
比如unsigned char* rev_buf; // 接收缓存

rev_buf[12] = 0x00;
rev_buf[4]*256 + rev_buf[5];
rev_buf[10]*256 + rev_buf[11] - 1;
rev_buf[0x1a + 0x08] = 0x00;等诸如此类的语句,这个含义到底是什么?
// 估计与具体协议有关

[解决办法]


//一些buf指针获取数据的几点计算而已
unsigned char* rev_buf;

rev_buf[12] = 0x00;
rev_buf[4]*256 + rev_buf[5];
rev_buf[10]*256 + rev_buf[11] - 1;
rev_buf[0x1a + 0x08] = 0x00;等诸如此类的语句,这个含义到底是什么?
//把某一个位置的数据清空而已, 地址也是一个值而已

//具体怎么弄,还得看你们代码的双方协议是怎么定的?
//得先看几天你们公司的通信协议先!方正都是一个buf指针搞来搞去的

------解决方案--------------------



/** rev_buf[12] = 0x00 */
rev_buf[12] = 0x00;
/** rev_buf[4]和rev_buf[5]两个字节共同组成一个16bit的整数 */
rev_buf[4]*256 + rev_buf[5];
/** rev_buf[10]和rev_buf[11]两个字节共同组成一个16bit的整数 */
rev_buf[10]*256 + rev_buf[11] - 1;
/** rev_buf[0x1a + 0x08] = 0x00 */
rev_buf[0x1a + 0x08] = 0x00;


构建结构体的思路是正确的,你可以先简单的理解为通讯协议的数据包:
1、协议双方对于每个字段的意义是约定好的,你可以据此构建你的结构体,注意一定要用紧凑模式,否则编译器会把你结构体的字段作一些对齐操作;
2、而通讯设备进行传输的时候,只是把数据包简单的看成是没有任何意义的字节流而进行操作。

引用:
刚接触网络通讯行业,经常看到这样类型的语句,
比如unsigned char* rev_buf;

rev_buf[12] = 0x00;
rev_buf[4]*256 + rev_buf[5];
rev_buf[10]*256 + rev_buf[11] - 1;
rev_buf[0x1a + 0x08] = 0x00;等诸如此类的语句,这个含义到底是什么?

如果说我要定义一个结构体来将rev_buf强制转换成结构体类型,我又要怎么去构建这个结构体。

typedef struct{
?
}
REV_STRUCT;

用的时候可以这样:

REV_STRUCT *ptr ;
ptr = (REV_STRUCT*)rev_buf; 求高手解答。。。

就是说: 用ptr指针的形式 替换 rev_buf[]里面的东西。 比如ptr指针形式替换 rev_buf[4]*256 + rev_buf[5],我在结构体中需要怎么定义?

谢谢各位大侠了。刚刚接触这个行业... 所以问了些奇怪的问题或者比较低级的问题 请不要见怪!:P

[解决办法]
引用:
Quote: 引用:


//一些buf指针获取数据的几点计算而已
unsigned char* rev_buf;

rev_buf[12] = 0x00;
rev_buf[4]*256 + rev_buf[5];
rev_buf[10]*256 + rev_buf[11] - 1;
rev_buf[0x1a + 0x08] = 0x00;等诸如此类的语句,这个含义到底是什么?
//把某一个位置的数据清空而已, 地址也是一个值而已

//具体怎么弄,还得看你们代码的双方协议是怎么定的?
//得先看几天你们公司的通信协议先!方正都是一个buf指针搞来搞去的



嗯是的,跟具体的协议的格式有关系这些语句。刚看代码看出了点头绪了..
但是还是有点小疑惑在,这个协议的格式上。还请大侠指点下:
这样的,假如我们的协议格式是这样的:
typedef struct HEAD_STRUCT
{
unsigned int he_name;
unsigned int hel_1[4];
unsigned int hel_2[4];
unsigned int hel_3[4];
unsigned int hel_4[4];
} HEAD_1;
那么
rev_buf[12] = 0x00 是不是就是表示 hel_3 为 0 ?
然后
rev_buf[7]*256 + rev_buf[8] = 0x01 ; 是不是就是表示hel_1 里面存放的值为 2 ?
rev_buf[10]*256 + rev_buf[11] - 1; 这个又表示什么?
然后他们之间是怎么对应的呢?求助..先谢谢啦~




这个要看你这个rev_buf的地址是指向哪里了阿?
根据具体地址的偏移指向让后旧可以知道值是多少了!
[解决办法]

HEAD_1 *ptr;
ptr = (HEAD_1*)rev_buf;
//这相当于是在rev_buf里取数据赋值给HEAD_1结构体
// 首先是rev_buf对应的地址偏移里有数据的 ,然后ptr在里面取值

[解决办法]
typedef struct HEAD_STRUCT
{
unsigned int he_name;
unsigned int hel_1[4];
unsigned int hel_2[4];
unsigned int hel_3[4];
unsigned int hel_4[4];
} HEAD_1;

HEAD_1 *ptr;
ptr = (HEAD_1*)rev_buf;

//rev_buf[12],rev_buf[7],rev_buf[8];
// 你的结构体都是unsigned int 应该是4个字节对齐的,所以取4字节的倍数才能取到正确的值

ptr->hel_1[1] = rev_buf[8];
ptr->hel_1[2] = rev_buf[12];

[解决办法]
引用:
Quote: 引用:

typedef struct HEAD_STRUCT
{
unsigned int he_name;
unsigned int hel_1[4];
unsigned int hel_2[4];
unsigned int hel_3[4];
unsigned int hel_4[4];
} HEAD_1;

HEAD_1 *ptr;
ptr = (HEAD_1*)rev_buf;

//rev_buf[12],rev_buf[7],rev_buf[8];
// 你的结构体都是unsigned int 应该是4个字节对齐的,所以取4字节的倍数才能取到正确的值

ptr->hel_1[1] = rev_buf[8];
ptr->hel_1[2] = rev_buf[12];


明白了,可是我在代码中看到了 很多比如 rev_buf[7],rev_buf[8],rev_buf[30],rev_buf[18] 这些单体,又不是4的倍数,那这个又怎么办?


那就按位取值了!你自己画下,从0开始按位取值,
如果经过了网络的话, 注意下高地位就好了
[解决办法]
不是很对,其实很简单的,你统一都换算成字节,数下来就好了:
char对应1字节,short int对应2字节,int对应4字节

引用:
Quote: 引用:


/** rev_buf[12] = 0x00 */
rev_buf[12] = 0x00;
/** rev_buf[4]和rev_buf[5]两个字节共同组成一个16bit的整数 */
rev_buf[4]*256 + rev_buf[5];
/** rev_buf[10]和rev_buf[11]两个字节共同组成一个16bit的整数 */
rev_buf[10]*256 + rev_buf[11] - 1;
/** rev_buf[0x1a + 0x08] = 0x00 */


rev_buf[0x1a + 0x08] = 0x00;



构建结构体的思路是正确的,你可以先简单的理解为通讯协议的数据包:
1、协议双方对于每个字段的意义是约定好的,你可以据此构建你的结构体,注意一定要用紧凑模式,否则编译器会把你结构体的字段作一些对齐操作;
2、而通讯设备进行传输的时候,只是把数据包简单的看成是没有任何意义的字节流而进行操作。

Quote: 引用:

刚接触网络通讯行业,经常看到这样类型的语句,
比如unsigned char* rev_buf;

rev_buf[12] = 0x00;
rev_buf[4]*256 + rev_buf[5];
rev_buf[10]*256 + rev_buf[11] - 1;
rev_buf[0x1a + 0x08] = 0x00;等诸如此类的语句,这个含义到底是什么?

如果说我要定义一个结构体来将rev_buf强制转换成结构体类型,我又要怎么去构建这个结构体。

typedef struct{
?
}
REV_STRUCT;

用的时候可以这样:

REV_STRUCT *ptr ;
ptr = (REV_STRUCT*)rev_buf; 求高手解答。。。

就是说: 用ptr指针的形式 替换 rev_buf[]里面的东西。 比如ptr指针形式替换 rev_buf[4]*256 + rev_buf[5],我在结构体中需要怎么定义?

谢谢各位大侠了。刚刚接触这个行业... 所以问了些奇怪的问题或者比较低级的问题 请不要见怪!:P



你这么说我有点明白了,然后还有一个问题,就是关于结构体字节和rev_buf[] 这之间的对应关系,有点乱,能不能指点下,要怎么去分清他们的关系。假如我的结构体是这样定义的:
typedef struct HEAD_STRUCT
{
unsigned int he_name;
unsigned int hel_1[4];
unsigned int hel_2[4];
unsigned int hel_3[4];
unsigned int hel_4[4];
} HEAD_1;

那么 rev_buf[7]*256 + rev_buf[8]就是 buf[7] buf[8]这两位对应的无符号整型数,对嘛?
那么在结构体中,用的是hel_1[]这个数组的值,这个数组有4个元素,hel_1[0],hel_1[1],hel_1[2],hel_1[3],具体是那个啊?还是默认的hel_1[0];
那么 rev_buf[12],rev_buf[7],rev_buf[8],如果只有一个,又代表着什么意义呢?还请大侠帮忙解答下~

[解决办法]
对于通信, 特别是要跨平台的通信, 最好还是按字节来设置值. 不然的话, 内存对齐, 大端小端会搞得你崩溃.
按字节填充数据包, 就不存在这样的问题了.
[解决办法]
很像填充数据帧帧头
这些操作有“拼接协议”的意思
*256等价于左移位8位,加上一字节等价于或运算——拼接高低字节。

rev_buf[12] = 0x00;//清零
rev_buf[4]*256 + rev_buf[5];//rev_buf[4]<<8
[解决办法]
rev_buf[5]
rev_buf[10]*256 + rev_buf[11] - 1;//(rev_buf[10]<<8
[解决办法]
rev_buf[11])-1如果是生成掩码,那么这个掩码也是15位的,我只是猜测
rev_buf[0x1a + 0x08] = 0x00;//0x1a + 0x08 = 0x1(a+8)=0x2(a+8-16)=0x2(a-8)=0x22


减1的那个操作我估计是生成掩码。

读书人网 >C语言

热点推荐