gpt4 book ai didi

c - Websocket 数据揭露/多字节异或

转载 作者:太空狗 更新时间:2023-10-29 16:07:55 25 4
gpt4 key购买 nike

websocket 规范将取消屏蔽数据定义为

j                   = i MOD 4
transformed-octet-i = original-octet-i XOR masking-key-octet-j

其中掩码的长度为 4 个字节,必须按字节应用取消掩码。

有没有比循环字节更有效的方法?

运行代码的服务器可以假定为 Haswell CPU,操作系统是内核 > 3.2 的 Linux,因此 SSE 等都存在。编码是用 C 语言完成的,但如果需要,我也可以使用 asm。

我曾尝试自己查找解决方案,但无法确定在数十个 SSE1-5/AVE/(无论扩展名中的任何一个中是否有适当的说明 - 多年来忘记了很多)

非常感谢!

编辑:在重新阅读规范几次之后,它似乎实际上只是将数据字节与掩码字节进行异或运算,我一次可以执行 8 个字节,直到最后几个字节。问题仍然悬而未决,因为我认为可能仍然有一种方法可以使用 SSE 等来优化它(也许一次处理 16 个字节?让进程执行 for 循环?...)

最佳答案

是的,您可以使用 SSE2 在一条指令中异或 16 个字节,或者使用 AVX2(Haswell 及更高版本)一次异或 32 个字节。

SSE2:

#include <emmintrin.h>                     // SSE2 instrinsics

__m128i v, v_mask;
uint8_t *buff; // buffer - must be 16 byte aligned

for (int i = 0; i < N; i += 16) // note that N must be multiple of 16
{
v = _mm_load_si128(&buff[i]); // load 16 bytes
v = _mm_xor_si128(v, v_mask); // XOR with mask
v = _mm_store_si128(&buff[i], v); // store 16 masked bytes
}

AVX2:

#include <immintrin.h>                     // AVX2 intrinsics

__m256i w, w_mask;
uint8_t *buff; // buffer - must be 16 byte aligned,
// and preferably 32 byte aligned

for (int i = 0; i < N; i += 32) // note that N must be multiple of 32
{
w = _mm256_load_si256(&buff[i]); // load 32 bytes
w = _mm256_xor_si256(w, w_mask); // XOR with mask
w = _mm256_store_si256(&buff[i], w); // store 32 masked bytes
}

关于c - Websocket 数据揭露/多字节异或,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17742741/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com