2012-10-29 1 views
2

현재의 디자인은 임베디드 시스템과 PC 사이의 통신을 포함합니다. 여기서 PC는 항상 구조체 설계로 윙윙 거리고 있습니다.struct를 패킹 할 때 바이트 정렬과 endianess를 처리하는 좋은 방법은 무엇입니까?

두 시스템은 내가 다룰 필요가있는 다른 엔디안을 가지고 있습니다. 그러나 문제를 해결하기 위해 매 4 바이트마다 간단한 바이트 순서 전환을 수행 할 수는 없습니다. 그것은 구조체에 의존하는 것으로 밝혀졌습니다. 예를 들어

, 이와 같은 구조체 :

{ 
    uint16_t a; 
    uint32_t b; 
} 

는 A와 B 사이의 패딩이 발생할 것이다. 결국 엔디안 스위치는 패딩 바이트가 있기 때문에 a 및 b에 고유해야합니다. 하지만 구조체 내용을 변경할 때마다 엔디안 스위치 논리를 변경해야하기 때문에보기가 흉하게 보입니다.

패딩이 들어올 때 구조체의 요소를 배열하는 좋은 전략은 무엇입니까? 구조체의 끝에 패딩 바이트 만 있도록 요소를 재 배열해야합니까?

감사합니다.

답변

0

다른 아키텍처의 정렬 요구 사항이 다르므로 플랫폼 중립적 직렬화를 수행해야 할 것 같습니다. 안전하고 일반적인 메모리 덩어리를 잡아서 다른 주소로 보내고 올바른 데이터를 읽는 다른 아키텍처로 보내는 것과 같은 일을하는 방법이라고는 생각하지 않습니다. 변환하고 요소를 하나씩 보내십시오. 버퍼에 값을 넣을 수 있습니다. 패딩이 없으므로 정확히 어디에 있는지 알 수 있습니다. 또한 전환을 수행 할 부분을 결정합니다 (일반적으로 PC에는 더 많은 자원이 있습니다). 보너스로 당신은 checksum/signalling the communication/에러를 잡을 수 있습니다.

컴파일러가 변수의 순서를 그대로 유지하면서 이론적으로는 (성능상의 이유로) 패딩을 추가 할 수 있으므로 이론적으로는 아키텍처와 관련이 없습니다.

+0

답장을 보내 주셔서 감사합니다. 엘리먼트의 수가 올라간다면, 엘리먼트를 하나씩 보내면 너무 많은 오버 헤드가 전달 될 것인가? 하지만 당신의 생각에 따르면, 유일한 대안은보다 구체적인 바이트 순서 로직을 설계하는 것입니다. – TroubleSDE

+0

그것은 실제 구현에 많이 의존합니다 (데이터를 전송하는 링크 등을 통해). 버퍼링의 일종을 사용하면 전송 오버 헤드 (전송 프로토콜 헤더에서 읽음)를 저장하고 코드를 읽기가 더 쉬울 수 있습니다 (즉, 데이터를 직렬화 및 역 직렬화하는 함수와 실제 전송을 수행하는 함수가 있습니다). – peterph