我正在通过一个小的C文件来解决xor解码问题,并且遇到了有关字节序的问题......我对如何解决它们感到有些困惑。这是我第一次在C中使用按位操作来深入演绎。
如果我使用一个字节的xor键并在uint8_t指针中选取几个xor编码的值,我的基本代码工作正常。遍历每个字节,将其与密钥对齐,并将结果存储在已解码的字节数组/缓冲区中,然后将其打印回控制台。
但是,如果我尝试使用双字节xor键,那么字节序会开始妨碍。我目前将密钥粘贴到uint32_t中,因为我不打算处理大于32位的xor密钥。在小端系统上,0xc39f
的xor密钥存储为0x9fc3
。如果我一次播放一个字节,那么要解码的字节是big-endian,但如果我尝试一次播放两个字节(与xor键大小相同),它们也会转换为little-endian )。
我很想#include <byteswap.h>
,然后致电bswap_32()
。但是虽然这可以在小端上工作,但它可能会对big-endian产生相反的影响。我认为那时我需要丑陋的#ifdef只能使用bswap_32()
来表示小端拱。我认为,必须有一种更便携的方式来实现这一目标。
随机样本字符串:
g e n e r a t e
67 65 6e 65 72 61 74 65
Xor 0xc39f
a4 fa ad fa b1 fe b7 fa
如果我用两字节(uint16_t)指针回放xor编码的缓冲区,我得到这个(通过基本的printf):
0xfaa4 0xfaad 0xfeb1 0xfab7
使用四字节指针(uint32_t):
0xfaadfaa4 0xfab7feb1
我希望上面提到的是两个字节的指针:
0xa4fa 0xadfa 0xb1fe 0xb7fa
四字节指针:
0xa4faadfa 0xb1feb7fa
思考?
编辑:任何参与者?目前的答案不足以满足我的需求。
答案 0 :(得分:2)
你过分思考 - 只需将你的xor密钥视为无二进制二进制blob,并将其转换为本机uint32_t
以获得性能:
void xor_encrypt_slow(uint8_t *data, size_t len, uint8_t key[4])
{
// key is a 4-byte xor key
size_t i;
for(i = 0; i < len; i++)
data[i] ^= key[i % 4];
}
void xor_encrypt_fast(uint8_t *data, size_t len, uint8_t key[4])
{
// Convert key to a 32-bit value
uint32_t key32 = *(uint32_t *)key;
// This assumes that data is aligned on a 4-byte boundary; if not, adjust
// accordingly
size_t i;
for(i = 0; i + 3 < len; i += 4)
((uint32_t *)data)[i] ^= key32;
// Handle the remainder, if len is not a multiple of 4
for( ; i < len; i++)
data[i] ^= key[i % 4];
}
答案 1 :(得分:0)
尝试使用专为此目的而设计的htonl()
宏。它代表“十六进制到网络长”,并定义为交换(或不交换)字节,以便在通过网络传输之前根据需要生成结果值big-endian。