나는 문자열 (네트워크에서 오는)에서 정의 된 bitoffset 및 bitlength (unsigned long long)로 최대 64 비트를 추출하고 싶습니다.
문자열은 정의되지 않은 길이 일 수 있으므로 바이트 단위로만 액세스해야합니다. (또한 _bextr_u32 내장 함수를 사용할 수 없음을 의미합니다). std bitset 클래스는 오프셋을 사용하여 하나 이상의 비트를 추출 할 수없고 미리 정의 된 비트 수만 추출 할 수 있기 때문에 사용할 수 없습니다.
그래서 나는 이미 byteoffset (문자열 내)과 bitoffset (시작 바이트 내)을 계산했습니다.
m_nByteOffset = nBitOffset / 8;
m_nBitOffset = nBitOffset % 8;
이제 시작 주소를 얻을 수 있습니다
const char* sSource = str.c_str()+m_nByteOffset;
그리고 비트 마스크
unsigned long long nMask = 0xFFFFFFFFFFFFFFFFULL >> (64-nBitLen);
하지만 이제 128 비트 정수를 사용할 수 없기 때문에 최대 64 비트를 추출하는 방법을 알아낼 수 없습니다.
unsigned long long nResult = ((*(unsigned long long*)sSource) >> m_nBitOffset) & nMask;
이것은 최대 64 비트 오프셋 비트에서만 작동하며, 비트 오프셋과 무관하게 64 비트에서 실제로 작동하도록 어떻게 확장 할 수 있습니까? 또한 이것은 바이트 단위 액세스가 아니기 때문에 메모리 읽기 액세스 위반을 일으킬 수 있습니다.
그래서 저는 실제로 최대 64 비트에서 작동하는이 문제에 대한 바이트 단위 솔루션을 찾고 있습니다. (바람직하게는 C 또는 내장 함수)
업데이트 : 많이 검색하고 테스트 한 후 RakNet에서이 기능을 사용할 것입니다 : https://github.com/OculusVR/RakNet/blob/master/Source/BitStream.cpp#L551
바이트 단위로 수행하려면 한 번에 한 바이트의 문자열 (BTW uint8_t
보다는 시퀀스로 해석하는 것이 더 낫습니다)을 읽고 char
결과를 8로 이동 or
하고 현재 바이트 로 변경하여 결과를 업데이트합니다 . 유일한 문제는 첫 번째 비트와 마지막 비트로, 둘 다 바이트의 일부를 읽어야합니다. 첫 번째 부분은 비트 마스크를 사용하여 필요한 비트를 얻고 마지막 부분은 필요한 양만큼 아래로 이동합니다. 다음은 코드입니다.
const uint8_t* sSource = reinterpret_cast<const uint8_t*>(str.c_str()+m_nByteOffset);
uint64_t result = 0;
uint8_t FULL_MASK = 0xFF;
if(m_nBitOffset) {
result = (*sSource & (FULL_MASK >> m_nBitOffset));
nBitLen -= (8 - m_nBitOffset);
sSource++;
}
while(nBitLen > 8) {
result <<= 8;
result |= *sSource;
nBitLen -= 8;
++sSource;
}
if(nBitLen) {
result <<= nBitLen;
result |= (*sSource >> (8 - nBitLen));
}
return result;
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다