2016-07-28 2 views
0

나는 다음과 같은 구조체가 있습니다는 바이트 버퍼 내부 구조체를 복사

, 내가 단일 바이트로이 값을 포장 할 필요가 UDP 패킷을 전송하기 위해
struct sample { 
    uint8_t four; 
    bool b; 
    uint8_t two; 
}; 

:

| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 
+---+---+---+---+---+---+---+---+ 
|  four  | 0 | b | two | 
+---------------+---+---+-------+ 

은 무엇입니까 이 바이트에 구조체 값을 복사하는 가장 좋은 방법은 무엇입니까? 나는 그것을 수행하기 전에 전제 조건을 점검하여 더 적은 공간에 uint8_t 값을 복사 할 때 데이터가 손실되지 않도록해야합니다. 코드가 어쨌든 휴대하지 않기 때문에

답변

5

난 그냥 기능을 사용 방법. 일반적으로 값을 이진수로 표현하면 오른쪽에 더 낮은 비트가 표시됩니다. 데이터를 포장하고 압축을 풀면 비트 순서를 선택할 수 있습니다. 네트워크 주문 대 시스템 주문에주의하십시오. byte-order-within-bytes는 모든 플랫폼에서 동일하지만 byte-order-in-word는 변경 될 수 있습니다.

포장/포장 풀기가 노력할 가치가 있는지 확인하려면 신청서를 알아야합니다. 각 측면에서 더 많은 컴퓨팅 및 UDP 패킷과 각 UDP 패킷에 몇 개의 데이터가 채워지는 간격에 따라 그만한 가치가 없을 수도 있습니다. 셀룰러 애플리케이션 용 데이터를 저장하려는 경우, 감사합니다. @)

플랫폼/컴파일러 편집증 때문에 항상 부울을 이동하지 마십시오. 대신 s.b? 32 : 0과 같은 것을 사용할 수 있습니다.

2

, 당신은뿐만 아니라 여기 비트 필드를 사용할 수 있습니다 :

struct sample { 
    uint8_t four:4; 
    bool empty:1; 
    bool b:1; 
    uint8_t two:2; 
}; 

나는 비트 필드의 더 팬이 없지만, 그들은 당신의 경우에 적용 할 것으로 보인다.

귀하의 비트 순서가 같다
return s.four | (s.b << 5) | (s.two << 6); 
+1

'비우기'가 'b'앞에 오지 않아야합니까? @ Slava, 확실하게 – Slava

+0

. 고정되어 있습니다. – SergeyA

+1

왜 휴대용이 아닙니까? – Jepessen

0

... 독특한 : 당신이 데이터 범위는 당신이 그에게 간단하게 할 수있다 선택되어 있는지 말했듯이

uint8_t pack(const sample &s) 
{ 
    return (s.four & 0xF) | (s.b << 5) | ((s.two & 3) << 6); 
} 

:

+0

CIGI 패킷을 만들려고하는데, 표준에는 이렇게 많은 패킷이 내장되어 있습니다 ... – Jepessen

+0

죄송합니다. 네트워킹 패킷은 항상이 방법으로 작성됩니다. –