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