비트 오프셋을 사용하여 std :: string에서 바이트 단위로 연속 비트 추출

Hendrik

나는 문자열 (네트워크에서 오는)에서 정의 된 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

Smeeheey

바이트 단위로 수행하려면 한 번에 한 바이트의 문자열 (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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

XOR 비트 연산을 사용하여 바이트 단위 비교 수행

분류에서Dev

파이프 된 출력의 연속 라인에서 Grep 바이트 오프셋

분류에서Dev

오일 확장을 사용하여 로봇 다리 서비스 호출 단위 테스트 및 조롱

분류에서Dev

std :: stringstream에서 std :: bitset으로 비트 추출

분류에서Dev

비디오 파일을 연결하여 Rails 프로젝트에서 단일 비디오 가져 오기

분류에서Dev

AVWriter / AVReader를 사용하여 0 바이트 파일을 작성하는 .mp4 비디오에서 .wav 오디오를 추출하는 스위프트 코드

분류에서Dev

루비를 사용하여 텍스트에서 단락을 추출하는 정규식

분류에서Dev

32 비트 바이너리를 사용하여 64 비트 시스템에서 ac 프로그램 컴파일

분류에서Dev

비트 시프트 연산자를 사용하여 바이트를 더 큰 정수로 결합하는 방법

분류에서Dev

Linux를 사용하여 로컬 기가비트 네트워크에서 공유되는 저 지연 비디오

분류에서Dev

Python을 사용하여 문자열에서 2 비트 정수 추출

분류에서Dev

비트 단위로 바이트 형성 및 바이트 연결

분류에서Dev

ffmpeg를 사용하여 mp2에서 FLAC로 채널을 추출 할 때 어떤 비트 레이트를 사용해야합니까?

분류에서Dev

Karma 및 Jasmine / Angular 8을 사용하여 병렬로 여러 API 호출이있는 서비스에 대한 단위 테스트

분류에서Dev

비디오에서 비트 레이트 데이터를 대량 추출하여 텍스트 파일로 출력하는 방법은 무엇입니까?

분류에서Dev

기존 onClick 비디오 이벤트에 무작위 연속 비디오 자동 재생을 추가하는 방법은 무엇입니까?

분류에서Dev

바이트 배열을 사용하여 비트 맵에 텍스트 추가 (비디오에 포함 된 자막 추가)

분류에서Dev

스프라이트를 만들기 위해 비디오에서 썸네일을 추출하는 것은 큰 비디오에서 정말 느립니다.

분류에서Dev

최하위 비트를 사용하여 MATLAB에서 숨겨진 이미지 추출

분류에서Dev

소프트웨어 RAID를 사용하여 Ubuntu 32 비트에서 64 비트로 업그레이드

분류에서Dev

소프트웨어 RAID를 사용하여 Ubuntu 32 비트에서 64 비트로 업그레이드

분류에서Dev

Python을 사용하여 지속적으로 업데이트되는 웹 페이지에서 콘텐츠 추출

분류에서Dev

ffmpeg를 사용하여 비디오 스트림 추출

분류에서Dev

안드로이드에서 비디오 프레임을 추출하고 비트 맵을 애니메이션하는 방법은 무엇입니까?

분류에서Dev

Interop을 사용하여 위치 (상단 및 왼쪽 오프셋)별로 Powerpoint TextFrame에서 텍스트를 선택할 수 있습니까?

분류에서Dev

C에서 비트 연산을 사용한 2 비트 매핑

분류에서Dev

무엇이 포스트 그레스 timestampTZ에서 OffsetDateTime을 비 정렬 화하는 데 사용되는 오프셋?

분류에서Dev

추출 플래그를 24 비트 정수로 비트 연산

분류에서Dev

콜백을 사용하여 자바 스크립트의 인수로 웹 서비스 메서드 호출

Related 관련 기사

  1. 1

    XOR 비트 연산을 사용하여 바이트 단위 비교 수행

  2. 2

    파이프 된 출력의 연속 라인에서 Grep 바이트 오프셋

  3. 3

    오일 확장을 사용하여 로봇 다리 서비스 호출 단위 테스트 및 조롱

  4. 4

    std :: stringstream에서 std :: bitset으로 비트 추출

  5. 5

    비디오 파일을 연결하여 Rails 프로젝트에서 단일 비디오 가져 오기

  6. 6

    AVWriter / AVReader를 사용하여 0 바이트 파일을 작성하는 .mp4 비디오에서 .wav 오디오를 추출하는 스위프트 코드

  7. 7

    루비를 사용하여 텍스트에서 단락을 추출하는 정규식

  8. 8

    32 비트 바이너리를 사용하여 64 비트 시스템에서 ac 프로그램 컴파일

  9. 9

    비트 시프트 연산자를 사용하여 바이트를 더 큰 정수로 결합하는 방법

  10. 10

    Linux를 사용하여 로컬 기가비트 네트워크에서 공유되는 저 지연 비디오

  11. 11

    Python을 사용하여 문자열에서 2 비트 정수 추출

  12. 12

    비트 단위로 바이트 형성 및 바이트 연결

  13. 13

    ffmpeg를 사용하여 mp2에서 FLAC로 채널을 추출 할 때 어떤 비트 레이트를 사용해야합니까?

  14. 14

    Karma 및 Jasmine / Angular 8을 사용하여 병렬로 여러 API 호출이있는 서비스에 대한 단위 테스트

  15. 15

    비디오에서 비트 레이트 데이터를 대량 추출하여 텍스트 파일로 출력하는 방법은 무엇입니까?

  16. 16

    기존 onClick 비디오 이벤트에 무작위 연속 비디오 자동 재생을 추가하는 방법은 무엇입니까?

  17. 17

    바이트 배열을 사용하여 비트 맵에 텍스트 추가 (비디오에 포함 된 자막 추가)

  18. 18

    스프라이트를 만들기 위해 비디오에서 썸네일을 추출하는 것은 큰 비디오에서 정말 느립니다.

  19. 19

    최하위 비트를 사용하여 MATLAB에서 숨겨진 이미지 추출

  20. 20

    소프트웨어 RAID를 사용하여 Ubuntu 32 비트에서 64 비트로 업그레이드

  21. 21

    소프트웨어 RAID를 사용하여 Ubuntu 32 비트에서 64 비트로 업그레이드

  22. 22

    Python을 사용하여 지속적으로 업데이트되는 웹 페이지에서 콘텐츠 추출

  23. 23

    ffmpeg를 사용하여 비디오 스트림 추출

  24. 24

    안드로이드에서 비디오 프레임을 추출하고 비트 맵을 애니메이션하는 방법은 무엇입니까?

  25. 25

    Interop을 사용하여 위치 (상단 및 왼쪽 오프셋)별로 Powerpoint TextFrame에서 텍스트를 선택할 수 있습니까?

  26. 26

    C에서 비트 연산을 사용한 2 비트 매핑

  27. 27

    무엇이 포스트 그레스 timestampTZ에서 OffsetDateTime을 비 정렬 화하는 데 사용되는 오프셋?

  28. 28

    추출 플래그를 24 비트 정수로 비트 연산

  29. 29

    콜백을 사용하여 자바 스크립트의 인수로 웹 서비스 메서드 호출

뜨겁다태그

보관