[완료]Byte 경계를 넘는(?) 비트필드 값의 해석..
글쓴이: Hamyt88 / 작성시간: 화, 2011/12/06 - 1:04오전
이걸 뭐라고 설명해야 할지 잘 모르겠네요.
요즘 C를 사용해서 네트워크로 데이터를 수신하는 프로그램을 만들고 있는데 72bit의 데이터 블록으로 수신합니다. Big Endian이더군요.
일단은
struct data_block{ unsigned char[9] __body; };
라고 구조체 선언해서 수신까지 해 놓긴 했는데 이 안에 든 데이터를 해석해야 합니다.
데이터를 해석을 하다 보니 바이트 경계를 넘어서 이어서 해석해야 하는 경우가 필요해졌습니다.
이런식으로 두 바이트가 있다고 한다면
12345678 12345678 ..... +--------+--------+---- | 1st | 2nd | +--------+--------+----
1st bit의 1~4번째 bit까지 하나의 값, 1st bit 5 ~ 2nd bit 4까지 하나의 값, 2nd bit 5~8까지 하나의 값... 이런 식으로 byte의 경계를 넘어 값이 이어집니다...
little endian 클라이언트에서 이걸 깔끔한 코드로 읽어낼 방법이 없을까요?
지금은 매크로 몇개 만든것 + 바이트 단위로 순서 바꾸고 비트연산해서 밀어내고 하다보니 점점 코드가 알아보기 힘들어지네요...
* 업무용 코드라 올리지 못하는것 양해 바랍니다.
Forums:
공용체(union)를
쓰시면 됩니다.
위와 같은 경우라면
질문은 "바이트 순서가 다른 이기종간에 바이트를
질문은 "바이트 순서가 다른 이기종간에 바이트를 넘나드는 비트필드를 깔끔하게 처리하는 방법"인데,
답변자께서 질문을 "비트필드를 깔끔하게 처리하는 방법"으로만 해석하신 듯 합니다.
저도 예전에 이런 문제를 깔끔하게 처리하는 방법에 대해 고민했는데, 뾰족한 방법이 없더라구요.
바이트가 구분되는 비트필드면, 아래의 RTP 구조체 처럼 정의하면 되는데,
아닌 경우는 어떻게 해야 할까요?
내 블로그: http://unipro.tistory.com
질문자님 방법 밖에 없을 듯 한데요.
Big Endian <-> Littne Endian 이라면, 지금 하시는 방법 이외에 별다른 방법이 없지 않을까요?
새로 만들면서 구조체와 공용체를 열심히
새로 만들면서 구조체와 공용체를 열심히 뒤섞어서(...) C코드에서 깔끔하게 `읽기'는 성공했는데 C++에서 불러다 쓰려니 또 문제가 생겨버렸습니다.
결국은 메시지 하나하나 다 읽기 함수를 만들어야겠군요.
메시지구분값은 위치가 정해져있으니.
C에서 잘 된다면
C++에서 불러다 써도 잘 되야 하는데요.
어떤 문제인지요?
언어보다도, read는 성공했는데 write에 문제가
언어보다도, read는 성공했는데 write에 문제가 있다는 말씀 같네요.
근데 padding 끄고 bitfield 구조체 사용하면 안되는건가요?
깔끔하게 `읽기'는 성공하셨다니 어떤 식으로
깔끔하게 `읽기'는 성공하셨다니 어떤 식으로 처리했는지 궁금하네요.
내 블로그: http://unipro.tistory.com
구조체 내부에 공용체 중첩해서 선언하고 등등의 뻘짓을
구조체 내부에 공용체 중첩해서 선언하고 등등의 뻘짓을 통해
실제 읽기는 버퍼에서 memcpy로 가능하게 만들었습니다.
문제는 구조체가 복잡해져서 읽기가 간단해진것 따위로는 위안이 되지 않는다는거지요...
댓글 달기