2013-04-22 3 views
1

비트로 타입을 정의 할 수 있는지 궁금합니다. 특히, RTP에 누적 된 누적 패키지 수를 저장하기 위해 24 비트 유형을 정의하려고합니다.비트로 C 타입을 정의하십시오.

그렇지 않은 경우 int에서 3 바이트를 어떻게 memcpy 할 수 있습니까? 내가 이렇게하면 , 나는 겁니다 방법을 잘 모르겠어요 :

memcpy(pkg + 29, (&clamped_pkgs_lost)+(sizeof(char)), 3*sizeof (char)); 
+0

Google의 '비트 필드' –

+0

@MartinJames 비트 필드의 주소를 사용할 수 없기 때문에 'memcpy'와는 관련이 없습니다. 하지만 OP는'memcpy '를 사용해서는 안됩니다. –

+0

'sizeof (char)'는'1'입니다. –

답변

2

당신은 적어도 24 비트 비트 필드를 사용하여 유형을 정의 할 수 있지만 비트 필드가 struct의 구성원이어야합니다

struct { 
    unsigned pkgs_lost: 24; 
}; 

당신은 비트 필드, 또는 단순한 사용 여부 응용 프로그램 내에서 값을 저장하려면 unsigned long과 같은 24 비트 이상의 유형이 있어야합니다. RTP 패킷에 복사하면 가장 간단한 방법은 한 번에 한 바이트 씩 복사하는 것입니다. 이는 RTP 패킷의 값이 항상 빅 엔디 언이며 호스트의 엔디안이 알려지지 않았기 때문입니다. 나가는 패킷 바이트 위치 33에서 24 비트 빅 엔디안 번호를 배치 할

pkg[33] = pkgs_lost >> 16; 
pkg[34] = pkgs_lost >> 8; 
pkg[35] = pkgs_lost; 

:

pkg 유형 unsigned char *의 가정하면, 당신은 뭔가를 할 것입니다.

1

이 C에서 당신은 단지 그 기본 유형 또는 비트 필드의 측면에서 정수 타입을 정의 할 수 있습니다.

비트 필드는 기발합니다. 당신은 그들의 주소를 가져갈 수 없습니다. 24 비트 만 있으면 공간을 절약 할 수는 없지만 플랫폼에는 8, 16 및 32 비트의 기본 유형 만 있습니다. 이 24 비트를 저장하려면 여전히 3 개의 8 비트 정수 또는 1 개의 32 비트 정수 (또는 1 16 비트 및 1 8 비트)를 사용해야합니다.

카운터처럼 간단하기 때문에 32 비트 정수를 사용하고 싶습니다. 8 개 최상위 비트를 제로 따라서 2 24 값을 -1로 제한

  • 주위에 랩을 시뮬레이션

    • : 나는 24 개 비트 값에 제한에 관심이 있다면, 두 가지 옵션이 있습니다 따라서 결코 넘어서지 않고 감싸지 않습니다.
  • +0

    값을 제한하면 3 번째 첫 번째 바이트를 가져 오려면 왼쪽 논리 시프트를 만들어야합니다. 맞습니까? –

    +0

    귀하의 의견이 보이지 않습니다. –

    0

    더 큰 정수에는 좁은 정수를 저장할 수 있습니다. 원하는 비트 만 마스크하십시오.

    int main() { 
        long data; 
        data & 0xFFFFFF; 
    } 
    

    또는 구조체 멤버에 비트 필드를 정의 할 수 있습니다. 그러나 bitfield 레이아웃이 표준화되지 않았기 때문에 구조체를 디스크에 쓰고 다른 시스템에서 열려고 시도하지 마십시오.

    struct { 
        long data:24; 
    }; 
    
    관련 문제