2010-12-14 3 views
1

나는이 다음과 같다 내가 자바 포트에 노력하고있어 일부 C++ 코드 :reinterpret_cast는 어떻게 작동합니까? (자바로 포팅 C++)

struct foostruct { 
    unsigned char aa : 3; 
    bool ab : 1; 
    unsigned char ba : 3; 
    bool bb : 1; 
}; 

static void foo(const unsigned char* buffer, int length) 
{ 

    const unsigned char *end = buffer + length; 

    while (buffer < end) 
    { 
     const foostruct bar = *(reinterpret_cast<const foostruct*>(buffer++)); 
     //read some values from struct and act accordingly 
    } 

} 

하고있는 reinterpret_cast 무엇입니까?

+0

참조 http://stackoverflow.com/questions/4805058/is-there-cast-in-java-similar-to-reinterpret -cast-in-c – Raedwald

답변

4

기본적으로 현재 포인터에서 표현 된 8 비트는 "foostruct"로 해석되어야합니다.

const unsigned char aa = *buffer & 0x07; 
const bool ab   = (*buffer & 0x08) != 0; 
const unsigned char ba = (*buffer & 0x70) >> 4; 
const bool bb   = (*buffer & 0x80) != 0; 

내가 훨씬 더 분명 다음 수행되고 있는지 생각 다음과 같이 제 생각에는

은 더 나은 기록 될 것입니다. 이 방법으로 자바로 이식하기가 더 쉬울 수도 있습니다.

+0

주의 : 오른쪽 교대가 잘못되었습니다. (각각 3, 4, 7로 오른쪽 교대) '더 나은'논쟁의 여지가 있습니다 ... –

+0

@ Pontus : 당신은 바 오른쪽으로 이동하는 것을 잊어 버렸습니다. 2 개의 bool은 오른쪽으로 이동하지 않습니다 .. 그들은 더 큰 것보다 큽니다 (bool을 반환하는 것보다 큽니다). – Goz

+0

아. 수정 정정 : 공동 작업 ... 평소와 같이 내가 기대했던 것을 읽었습니다! –

4

클래식 C 스타일 (const foostruct *)buffer은 최악의 경우를 수행합니다. C++에 모든 안전을 무시하고 실제로 무엇을하고 있는지 알게합니다. 이 경우 buffer은 실제로는 foostruct으로 구성되며, 차례로 단일 8 비트 문자에 비트 필드가 중첩됩니다. 기본적으로 바이트를 가져 와서 이동 및 마스크 작업을 직접 수행하여 Java에서 동일한 작업을 수행 할 수 있습니다.

2

부호없는 char에 대한 포인터가 있습니까? 포인터가 가리키는 비트가 foostruct 유형의 객체 인 것처럼 취급됩니다. 이것이 reinterpret_cast가하는 것입니다. 비트 패턴을 다른 타입의 메모리 표현으로 재 해석합니다 ...