Я немного растерялся. Я хочу извлечь до 64 бит с определенным битовым и битрейтом (без знака длинного длинного) из строки (исходящей из сети).Извлечение непрерывных битов из std :: string bytewise с смещением битов
Строка может иметь неопределенную длину, поэтому мне нужно обязательно получить к ней доступ только Bytewise. (Также означает, что я не могу использовать _bextr_u32 intrinsic). Я не могу использовать класс std bitet, потому что он не позволяет извлекать более одного бита со смещением, а также позволяет извлекать предварительно определенное количество бит.
Итак, я уже вычисляю байтовое (внутри строки) и битовое (в начальном байте).
m_nByteOffset = nBitOffset/8;
m_nBitOffset = nBitOffset % 8;
Теперь я могу получить начальный адрес
const char* sSource = str.c_str()+m_nByteOffset;
И битовую маску
unsigned long long nMask = 0xFFFFFFFFFFFFFFFFULL >> (64-nBitLen);
Но теперь я просто не могу понять, как извлечь до 64 бит от этого, как есть нет 128-битных целых чисел.
unsigned long long nResult = ((*(unsigned long long*)sSource) >> m_nBitOffset) & nMask;
Это работает только на срок до 64-bitoffset бит, как я могу продлить это реально работать на 64 бита независимо обозначают от bitoffset. А также, поскольку это не побочный доступ, это может вызвать нарушение доступа к памяти.
Так что им действительно нужно найти пошаговое решение этой проблемы, которая работает до 64 бит. (Предпочтительно C или встроенные функции)
Update: После поиска и тестирования много я, вероятно, использовать эту функцию из RakNet: https://github.com/OculusVR/RakNet/blob/master/Source/BitStream.cpp#L551
Мне нравится это разделение проблемы, это будет работать плохо, сделайте некоторые тесты позже сегодня – Hendrik
«static_cast» должен работать, поскольку 'const char *' должен быть совместим с 'const uint8_t *'. Это даст вам некоторую безопасность против опечаток. –
Это может скомпилировать какой-то довольно плохой asm с gcc. например он может фактически сдвигать и загружать один байт за раз. :/In asm, загрузка до 64 бит, которые не могут быть выровнены по байтам, должна выполняться с байтовой загрузкой, неуравновешенной нагрузкой на 64 бит и сменой пары. (И «OR», если вы не используете сдвиг с двумя регистрами, например [x86's 'shrd'] (http://www.felixcloutier.com/x86/SHRD.html), чтобы взять окно конкатенации 2 регс). Филиалы не являются обязательными, чтобы пропустить байтовую нагрузку, если одна 64-разрядная загрузка может включать в себя всю желаемую bitstring. Если вам повезет, вы получите asm от этого src. –