나는 부호없는 반바지 묶음을 메모리에 압축하는 알고리즘을 뒤집어 쓰려고합니다. 나는 그것을 역전 시키려고 시도했다. 그리고 나는 정확한 숫자를 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 메모리, 아무것도에서에 쓴 숫자에 따라하지만 매초마다 ~ 두 번째로 읽는 숫자가 틀립니다.
내가 여기서 잘못하고있는 아이디어가 있습니까?
영어로 포장재를 설명 할 수 있습니까? 심지어 수학 공식 (가독성을 위해) : value = (x * 8) | yz << xyz – Adrian
아래의 답을 작성한 후에도 코드를 분석하는 것만으로 컴팩트 한 방법을 정확히 알 수는 없습니다. –
@ Adrian 그것은 16 비트 워드마다 10 개의 하위 비트를 취하고 그 중 4 개를 5 바이트 (40 비트)로 다시 패킹하는 것처럼 보입니다. –