共2条
1/1 1 跳转至页
问
最近一直被一个问题困扰
定义一个结构和一个缓冲区以及一个指针
typedef struct
{
uint8 a1;
uint16 a2;
}TEST;
uint8 buf[10]={0x01,0x02,0x03,0x04};
TEST * temp;
后
uint8 b1;
uint16 b2;
temp = (TEST *) buf;
b1 = temp->a1;
b2 = temp->a2;
结果应该是 b1 = 0x01;b2 = 0x0203
可仿真的结果是 b1 = 0x01;b2 = 0x0003
我的0x02哪去了???请教怎么解决?谢谢诸位大侠
答 1: 也许跟CPU的类型有关你用的是什么CPU?编译器呢? 答 2: packed struct 答 3: 估计是uint8 buf[10]定义有问题,类型不匹配 答 4: 同意cwal20同意cwal20
估计是uint8 buf[10]定义有问题,类型不匹配 答 5: 是这样的cpu 就是LPC2210 编译器是ADS1.2
uint8 以被定义 #define unsigned char uint8 答 6: 字节对齐方式,ARM是32位的,我在移植TCP/IP时,就碰到IP Header和UDP Header存在类似的情况,示例如下
typedef __packed struct TIPHeader
{
// IP header
/*
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Ver= 4 |IHL= 5 |Type of Service| Total Length = 21 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification = 111 |Flg=0| Fragment Offset = 0 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time = 123 | Protocol = 1 | header checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| source address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| destination address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding | < optional
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data ..........
+-+-+-+-+-+-+-+-+
*/
u8 VerLen;
u8 TOS;
u16 TotalLength;
u16 ID;
u16 Fragment;
u8 TTL;
u8 Protocol;
u16 Checksum;
T_IP_Addr SourceIP;
T_IP_Addr DestIP;
} T_IP_Header; 答 7: 有什么好的解决方法没?主要是别丢数据.
我也是在写TCP/IP协议栈的时候遇到的问题.
比较烦 答 8: 我觉得ADS1.2的结构体分配内存有问题你可以想办法查看一下 sizeof(TEST)到底多大,估计不是3。
我在做文件系统的MBR结构时遇到过结构体不能正常分配的问题。
定义一个结构和一个缓冲区以及一个指针
typedef struct
{
uint8 a1;
uint16 a2;
}TEST;
uint8 buf[10]={0x01,0x02,0x03,0x04};
TEST * temp;
后
uint8 b1;
uint16 b2;
temp = (TEST *) buf;
b1 = temp->a1;
b2 = temp->a2;
结果应该是 b1 = 0x01;b2 = 0x0203
可仿真的结果是 b1 = 0x01;b2 = 0x0003
我的0x02哪去了???请教怎么解决?谢谢诸位大侠
答 1: 也许跟CPU的类型有关你用的是什么CPU?编译器呢? 答 2: packed struct 答 3: 估计是uint8 buf[10]定义有问题,类型不匹配 答 4: 同意cwal20同意cwal20
估计是uint8 buf[10]定义有问题,类型不匹配 答 5: 是这样的cpu 就是LPC2210 编译器是ADS1.2
uint8 以被定义 #define unsigned char uint8 答 6: 字节对齐方式,ARM是32位的,我在移植TCP/IP时,就碰到IP Header和UDP Header存在类似的情况,示例如下
typedef __packed struct TIPHeader
{
// IP header
/*
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Ver= 4 |IHL= 5 |Type of Service| Total Length = 21 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification = 111 |Flg=0| Fragment Offset = 0 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time = 123 | Protocol = 1 | header checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| source address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| destination address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding | < optional
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data ..........
+-+-+-+-+-+-+-+-+
*/
u8 VerLen;
u8 TOS;
u16 TotalLength;
u16 ID;
u16 Fragment;
u8 TTL;
u8 Protocol;
u16 Checksum;
T_IP_Addr SourceIP;
T_IP_Addr DestIP;
} T_IP_Header; 答 7: 有什么好的解决方法没?主要是别丢数据.
我也是在写TCP/IP协议栈的时候遇到的问题.
比较烦 答 8: 我觉得ADS1.2的结构体分配内存有问题你可以想办法查看一下 sizeof(TEST)到底多大,估计不是3。
我在做文件系统的MBR结构时遇到过结构体不能正常分配的问题。
共2条
1/1 1 跳转至页
回复
我要赚赏金打赏帖 |
|
|---|---|
| 设备功耗web监控界面(ESP32C5)被打赏¥28元 | |
| OrangePiZero2W系统被打赏¥33元 | |
| Linux环境下以模拟方式快速实现出入管理功能测试被打赏¥24元 | |
| 树莓派3+Klipper,老3D打印机满血升级被打赏¥33元 | |
| OK1126B-S开发板下串口屏及其应用被打赏¥21元 | |
| 低功耗超声波液位测距仪(ESP32S3)被打赏¥27元 | |
| 在K230DBOX上实现多时段语音提示功能被打赏¥14元 | |
| 使K230DBOX实现相机持续拍照功能被打赏¥12元 | |
| 基于K230DBOX的文本管理器设计被打赏¥14元 | |
| 基于K230DBOX的彩色画板功能实现被打赏¥15元 | |
我要赚赏金
