좋아, 나는 이것을 시도하고 고칠 것들이 부족합니다.
다음과 같은 구조체가 있습니다.
typedef struct
{
u8int NodeType;
u32int Group;
u32int Direction;
u16int ID;
} tsTargetNode;
void vTrackNode(const uint8 *pu8Val, uint8 u8Len, void *pvCbData)
{
/* Copy data */
memcpy(pvCbData, pu8Val, u8Len);
/* Doing this gives the wrong data */
//tsTargetNode *node = (tsTargetNode *) pvCbData;
/* Doing this gives the right data */
memcpy(&tsTargetNode.NodeType, pvCbData, 1);
memcpy(&tsTargetNode.Group, pvCbData+1, 4);
memcpy(&tsTargetNode.Direction, pvCbData+1+4, 4);
memcpy(&tsTargetNode.ID, pvCbData+1+4+4, 2);
}
예 : 전달 된 데이터 * pu8Val = 0x AA BB CC DD EE FF 11 22 33 44 55 66 77 88 99 00
포인터를 사용하여 검색 한 데이터는 다음과 같습니다.
NodeType = 0xAA
Group = 0xFF112233
Direction = 0x44556677
ID = 0x8899
하지만 수동으로 memcpy, 검색 한 데이터가 정확합니다.
NodeType = 0xAA
Group = 0xBBCCDDEE
Direction = 0xFF112233
ID = 0x4455
NodeType에 4 바이트를 복사하려고 시도하는 첫 번째 세트처럼 보입니다.
포인터 복사를 잘못하고 있습니까? 아니면 장치 / HW 문제 일 수 있습니까?
컴파일러는 구조의 멤버 사이에 패딩을 자유롭게 추가 할 수 있으므로 각 멤버는 플랫폼에 적합한 모든 항목에 정렬됩니다. 여기서는 32 비트처럼 보입니다. 인쇄를 시도 하고 필드가 어떻게 배치되는지 확인하기 sizeof(tsTargetNode)
위해 초기화 된 파일에서 많은 바이트를 덤프합니다 tsTargetNode
.
어떤 컴파일러를 사용하고 있는지는 말하지 않았지만 구조에 패딩을 비활성화하는 컴파일러 별 방법이있을 것입니다. 그렇게하면 메모리 레이아웃이 버퍼와 일치합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다