2012-02-10 2 views
2

나는 부호없는 반바지 묶음을 메모리에 압축하는 알고리즘을 뒤집어 쓰려고합니다. 나는 그것을 역전 시키려고 시도했다. 그리고 나는 정확한 숫자를 50 % ~ 75 % 뒤로 돌려 놓는다. 그래서 내가 잘못하고있는 것이 확실하지 않다. 모든 숫자가 메모리에 포장 될 때까지이, 다음 호출로 반환 bStart을 통과, 연속으로 여러 번 호출비트 패킹 알고리즘 반전

BYTE packNumber(BYTE bStart, WORD value, BYTE * buffer, DWORD * counter) 
{ 
    value = (value<<(6-bStart)); 
    *(buffer + *counter) |= (BYTE)(value>>8); 
    *(buffer + *counter+1) |= (BYTE)value; 

    bStart = (bStart+2)%8; 

    if (bStart) 
     *counter+= 1; 
    else 
     *counter+= 2; 

    return bStart; 
} 

:

메모리에 숫자를 포장하는 알고리즘이다.

이 그것을 역에서 내 시도이다 : 나는 다시 정확한 데이터의 무리를 얻을 수 있기 때문에 내가, 내가 바로 뭔가를하고 있어요 알고

BYTE unpackNumber(BYTE bStart, WORD *value, BYTE * buffer, DWORD * counter) 
{ 
    *value= 0; 

    *value|= *(buffer + *counter); 
    *value= *value<< 8; 
    *value|= *(buffer + *counter+1); 

    *wVal = (*value>>(6-bStart)); 

    bStart = (bStart+2)%8; 

    if (bStart) 
     *counter+= 1; 
    else 
     *counter+= 2; 

    return bStart; 
} 

I 메모리, 아무것도에서에 쓴 숫자에 따라하지만 매초마다 ~ 두 번째로 읽는 숫자가 틀립니다.

내가 여기서 잘못하고있는 아이디어가 있습니까?

+1

영어로 포장재를 설명 할 수 있습니까? 심지어 수학 공식 (가독성을 위해) : value = (x * 8) | yz << xyz – Adrian

+0

아래의 답을 작성한 후에도 코드를 분석하는 것만으로 컴팩트 한 방법을 정확히 알 수는 없습니다. –

+0

@ Adrian 그것은 16 비트 워드마다 10 개의 하위 비트를 취하고 그 중 4 개를 5 바이트 (40 비트)로 다시 패킹하는 것처럼 보입니다. –

답변

3

WORD는으로 작동해야하는 것처럼 보입니다. 당신이 원하기 때문에, 또한 :

거의 그렇지 않은 것을 셨을 텐데요, 그리고 변화에 서명되고 결국 (따라서 높은 비트는 부호 비트의 제로하지만 복사되지 않습니다에서 이동)

편집 10 비트가 나오면 * wVal & = 0x03ff로 가능한 상위 비트를 제거해야합니다.

이것은 서명되지 않은 짧은 단어로 작동하는 것 같습니다.

BYTE unpackNumber(BYTE bStart, WORD *value, BYTE * buffer, DWORD * counter) 
{ 
    *value= 0; 

    *value|= *(buffer + *counter); 
    *value= *value<< 8; 
    *value|= *(buffer + *counter+1); 

    *value = (*value>>(6-bStart)) & 0x3ff; // <-- remove extraneous bits 

    bStart = (bStart+2)%8; 

    if (bStart) 
     *counter+= 1; 
    else 
     *counter+= 2; 

    return bStart; 
} 
+0

좋은 추측도 있습니다. 그러나 이것이 때때로 작동하는 이유를 설명하지 못합니다. –

+0

@MichaelDorgan bStart = 6이거나 높은 비트가 0 인 압축 된 단어에서 작동하고 bstart! = 6이고 높은 비트가 1 인 압축 된 단어에서 실패합니다. 임의가 아니지만 1/2-1/4 소리가납니다. 올바른 주파수. –

+0

좋은 지적. 함수의 입력에 대한 피드백이 없으면 추측을 유지해야합니다.하느님 - 잘못한 이진의 사랑을 위해 단정하십시오! –

0

Ouchy, 당신의 C 코드가 내 머리를 아프게합니다. 당신은 당신의 입학 조건을 주장합니까? RAM에 쓰는 방법은 수표가 없으면 무섭습니다. 또한 bStart가 6보다 큰 경우에는 시프트가 정의되지 않습니다. 내 생각 엔 bStart> 6이 문제입니다. BTW, 이건 전혀 C++ 코드가 아니에요. 바로

+0

코드가 너무 아파요. 나는 함수가 얻는 모든 데이터가 유효하다는 것을 확인하고있다. 또한 줄 때문에 bStart = (bStart + 2) % 8; bStart는 초기 입구 값에 따라 0,2,4,6 – Ash

+0

또는 1,3,5,7에서 회전합니다. 또한 처음부터 bstart는 6보다 클 수 있습니다. bstart에 assert()를 추가 할 것입니다. –

+0

왜 downvote? –