C 作为宏实现的XOR未按预期工作

C 作为宏实现的XOR未按预期工作,c,macros,xor,C,Macros,Xor,我有一个输入字符串作为CHAR-cszReadBuffer[1000],它通过一个键作为CHAR-cszreadbeybuffer[10]对其应用异或操作,实际上我从包含以下内容的两个文件中读取key和buffer 关键文件内容: abcd aaaaaddddrrrttt bbbbrfgergv b eeerwef 输入文件内容: abcd aaaaaddddrrrttt bbbbrfgergv b eeerwef 当我阅读键和缓冲区大小和内容时,它们绝对正确,如下所示: dwKeyFi

我有一个输入字符串作为
CHAR-cszReadBuffer[1000]
,它通过一个键作为
CHAR-cszreadbeybuffer[10]
对其应用异或操作,实际上我从包含以下内容的两个文件中读取
key
buffer

关键文件内容:

abcd
aaaaaddddrrrttt
bbbbrfgergv
b
eeerwef
输入文件内容:

abcd
aaaaaddddrrrttt
bbbbrfgergv
b
eeerwef
当我阅读
缓冲区
大小和内容时,它们绝对正确,如下所示:

dwKeyFileLength(key length) is 4 byte
dwLastBitChunk(input-file length) is 40 byte
#define     XOR(data, dsize, key, keysize) \
    for(int i = 0;i < dsize;i++) \
        data[i] = data[i] ^ key[i % keysize]; \
内容(
cszReadBuffer
cszreadbeybuffer
)也与上述文件中的内容相同

现在,通过下面的实现,
XOR
加密和解密工作正常:

for(int i = 0;i < dwLastBitChunk;i++)
    cszReadBuffer[i] = cszReadBuffer[i] ^ cszReadKeyBuffer[i % dwKeyFileLength];
我还有另一个实现,如下所示

#define   XOR(data, key) \
    LONG lKeySize = lstrlenA(key); \
    for(int i = 0;i < lstrlenA(data);i++) \
        data[i] = data[i] ^ key[i % lKeySize]; \
仅用于加密)它给我以下输出:

 aaaaddddrrrttt
bbbbrfgergv
b
eeerwef

我想知道为什么会这样?有什么建议吗?

您正在每个循环中计算
lstrlenA(数据)
,但
数据
正在变化

输入和键的第一个字符是
'a'
so

'a' ^ 'a' ==> 0
所以循环只迭代一次。必须使用以前设置的变量打印加密字符串


计算循环外的字符串长度,就像您在成功的示例中所做的那样。

您正在计算每个循环中的
lstrlenA(data)
,但是
数据
正在变化

输入和键的第一个字符是
'a'
so

'a' ^ 'a' ==> 0
所以循环只迭代一次。必须使用以前设置的变量打印加密字符串

计算循环外的字符串长度,就像您在成功的示例中所做的那样。

我得到了它(在解密时)。在
循环中使用
lstrlenA()
与在
循环外使用
没有区别,因为:

因为我从文件中读取缓冲区,并且缓冲区中可能存在
0
字符,所以当我在
macro
中使用
lstrlenA()
或任何它给我错误大小的地方时(可能是
0
在缓冲区中),所以我应该直接使用缓冲区大小作为
lpNumberOfBytesRead
值(指示在我的
宏中使用
ReadFile()
函数读取文件时读取的字节数),并为此添加
datasize
参数

我的
缓冲区中也存在此问题

因此,它必须将
数据
大小传递给宏,如下所示:

dwKeyFileLength(key length) is 4 byte
dwLastBitChunk(input-file length) is 40 byte
#define     XOR(data, dsize, key, keysize) \
    for(int i = 0;i < dsize;i++) \
        data[i] = data[i] ^ key[i % keysize]; \
XOR()
参数中,我不应该使用
lstrlenA()
,因为
buffer
中存在
0
的可能性。因此我使用了
lpNumberOfBytesRead
sa直接缓冲区大小和我的密钥作为直接文件大小。

我在解密时得到了它()在
循环中使用
lstrlenA()
或在
循环外使用
lstrlenA()
没有区别,因为:

因为我从文件中读取缓冲区,并且缓冲区中可能存在
0
字符,所以当我在
macro
中使用
lstrlenA()
或任何它给我错误大小的地方时(可能是
0
在缓冲区中),所以我应该直接使用缓冲区大小作为
lpNumberOfBytesRead
值(指示在我的
宏中使用
ReadFile()
函数读取文件时读取的字节数),并为此添加
datasize
参数

我的
缓冲区中也存在此问题

因此,它必须将
数据
大小传递给宏,如下所示:

dwKeyFileLength(key length) is 4 byte
dwLastBitChunk(input-file length) is 40 byte
#define     XOR(data, dsize, key, keysize) \
    for(int i = 0;i < dsize;i++) \
        data[i] = data[i] ^ key[i % keysize]; \

XOR()
参数中,我不应该使用
lstrlenA()
,因为在
buffer
中存在
0
的可能性。因此我使用了
lpNumberOfBytesRead
sa直接缓冲区大小和我的键作为直接文件大小。

没有任何错误;如何将参数传递给宏?(我已经看到,在宏中,当您不在参数中包装参数的用法时,许多事情都会出错)…例如,如果您将
参数作为
1+keyBuf
@lockcmpxchg8b传递,则我将
cszReadBuffer
cszReadKeyBuffer
作为数据和键传递,没有任何更改。@WeatherVane我尝试过,但它不起作用。收到回答后请不要更改代码。将修订后的代码添加为编辑。回滚。如何打印加密的字符串?没有任何错误;如何将参数传递给宏?(我已经看到,在宏中,如果不在参数中包装参数的用法,许多事情都会出错)…例如,如果您将
参数作为
1+keyBuf
@lockcmpxchg8b传递,则我将
cszReadBuffer
cszReadKeyBuffer
作为数据和键传递,没有任何更改。@WeatherVane我尝试过,但它不起作用。收到回答后请不要更改代码。将修订后的代码添加为编辑。回滚。如何打印加密字符串?我尝试了'LONG lDataSize=lstrlenA(data);\for(int i=0;i