一个结构体的问题.

love830315 2006-04-04 01:09:18
typedef struct _TP_DELIVER_HEAER
{
UINT1 TP_RP : 1;
UINT1 TP_UDHI : 1;
UINT1 TP_SRI : 1;
UINT1 :2;
UINT1 IP_MMS : 1;
UINT1 TP_MTI : 2;
/*
this length is alterable, if the length is shortage of 12 octets.
The first octet contains the length of the TP-OA.
*/
UCHAR1 TP_OA[1];

} TP_DELIVER_HEAER;
我想要前面的六个UINT1占一个字节,而后面的UCHAR1占一个字节,而且其地址应是相邻的.
即假如有一个两个字节长度的数组,我可以用一个该对象的指针去指向数组,然后里面的数据跟数组是对应的,我该怎么做呢?
...全文
229 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuanchuang 2006-04-06
  • 打赏
  • 举报
回复
字节相对应的话,用强制类型转换应该是可以的。
强制类型转换以后,他并不管你以前存储的格式,而是只按转换后的类型,到内存中取值而已。
笑面佛_正版 2006-04-06
  • 打赏
  • 举报
回复
#pragma pack(1)
/* 结构体按1个字节对齐 */
jixingzhong 2006-04-04
  • 打赏
  • 举报
回复
楼主试试把 int 都改成 char ...

就内存对齐来说,
应该能符合楼主的要求了 ~
jixingzhong 2006-04-04
  • 打赏
  • 举报
回复
typedef struct _TP_DELIVER_HEAER
{
int TP_RP:1;
int TP_UDHI:1;
int TP_SRI:1;
int :2;
int IP_MMS:1;
int TP_MTI:2;

int TP_OA:8;

} TP_DELIVER_HEAER;

sizeof(TP_DELIVER_HEAER) 是两个字节 ...

32位环境下 因为 int 是4字节的,
所以最后会对齐到 4 ,
结果得到 4 字节 ....
love830315 2006-04-04
  • 打赏
  • 举报
回复
谢谢各位,看来是只能用位操作了.
过一两天再结帖.
ccccffff 2006-04-04
  • 打赏
  • 举报
回复
用union吧
goodluckyxl 2006-04-04
  • 打赏
  • 举报
回复
UINT1 该成char就可以了
或者 直接所有的位在字节内表示 总体表达成unsigned char
后面操作使用位操作就可以了

love830315 2006-04-04
  • 打赏
  • 举报
回复
好的,位操作是没有什么问题的了
去年课设的时候做个一个VLAN,用过结构体指针指向缓冲,觉得很方便,所以想用这个.
想问下ugg(逸学堂(exuetang.net)) ,碰上这种情况一般都是用位操作来获得信息的吗?或者还有其他什么方法?
三文鱼也会飞 2006-04-04
  • 打赏
  • 举报
回复
typedef union SET
{
struct SET_B
{
UINT1 TP_RP : 1;
UINT1 TP_UDHI : 1;
UINT1 TP_SRI : 1;
UINT1 :1;
UINT1 IP_MMS : 1;
UINT1 TP_MTI : 1;
}SET_BIT;
UCHAR1 TP_OA[1];
}S_BIT;
逸学堂 2006-04-04
  • 打赏
  • 举报
回复
楼主可以根据自己的要求,看看C语言中关于位操作的章节。
逸学堂 2006-04-04
  • 打赏
  • 举报
回复
即假如有一个两个字节长度的数组,我可以用一个该对象的指针去指向数组,然后里面的数据跟数组是对应的,我该怎么做呢?
~~~~~~~~~~~~~~~~~~~
lz看来对指针理解有些偏差,该对象指针只能指向该对象类型,如果动态修改指针类型,其后果不可预料。所以出发点,楼主想用该对象指针,指向数组(char,int)都是不可取的。
TP_DELIVER_HEAER *p;
char aa[2];
p = aa; // 是不对的,动态转换p = dynamic_cast<TP_DELIVER_HEAER*>aa;这样转换可以成功
// 但是不能保证运行正确。刚看见是用C语言写,那就不存在动态转换,这样写
// p = (TP_DELIVER_HEAER*)aa;
jinjiajie 2006-04-04
  • 打赏
  • 举报
回复
用union,把前面的东西做成union,会按最大的只占一个字节,然后取出第一个位置的union后,用位运算把这些东西算出来
ouyh12345 2006-04-04
  • 打赏
  • 举报
回复
union

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧