простой способ сделать ваш XOR-маскировка байтами:
void encrypt(uint8_t* in, size_t len, const uint8_t key[8])
{
for (size_t i = 0; i < len; i++) {
in[i] ^= key[i % 8];
}
}
Примечание: здесь key
представляет собой массив из 8 байтов, а не 64-разрядное число. Этот код прост - никаких трюков не требуется, их легко отлаживать. Измерьте его производительность и выполняйте его, если производительность достаточно хорошая.
Некоторые (наиболее?) Компиляторы оптимизируют такой простой код на vectorizing it. То есть все детали (отбрасывание до uint64_t
и т. Д.) Выполняются компилятором. Однако, если вы пытаетесь быть «умными» в своем коде, вы можете непреднамеренно предотвратить компилятор от оптимизации. Поэтому попробуйте написать простой код.
P.S. Вероятно, вы также должны использовать ключевое слово restrict
, которое в настоящее время является нестандартным, но может потребоваться для обеспечения максимальной производительности. У меня нет опыта его использования, поэтому я не добавил его к моему примеру.
Если у вас плохой компилятор, не может включить опцию векторизации, или просто хотите играть вокруг, вы можете использовать эту версию с литьем:
void encrypt(uint8_t* in, size_t len, uint64_t key)
{
uint64_t* in64 = reinterpret_cast<uint64_t*>(in);
for (size_t i = 0; i < len/8; i++) {
in64[i] ^= key;
}
}
Он имеет некоторые ограничения:
- Требуется, чтобы длина была делящейся на 8
- Требуется, чтобы процессор поддерживал невыровненные указатели (не уверен, что о x86 - возможно, будет работать)
- Компилятор может отказаться от вексеризации этого, что приводит к ухудшению качества работы
- Как отмечено Hurkyl, порядок 8 байтов в маске не ясен (на x86, little-endian, младший байт будет маскировать первый байт входного массива)
Вам нужно убедиться, что ваш символ [] правильно выровнен, если вы хотите пройти этот маршрут. Безопаснее работать по одному байту за раз, пока производительность не потребует иного. – ildjarn
Пожалуйста, добавьте хотя бы пример кода [минимального] (http://stackoverflow.com/help/mcve), чтобы показать, что именно вы хотели бы достичь. Почему вам все равно нужны байты указателей XOR? – Jezor
@ildjarn Я собираюсь делать это до нескольких мегабайт, поэтому производительность имеет решающее значение. :/ – TheAbelo2