Tra*_*xel 3 c printf unsigned char unsigned-char
对于一个学校项目,我正在写一个河豚加密(只是加密,而不是解密).我已经完成了加密,我决定将解密用于娱乐(在Blowfish中很容易).
我使用无符号字符来表示字节(尽管我认为uint8_t会更便携).当我试图打印出解密的字节时,我遇到了这个问题.我正在加密纯文本消息.我已经能够打印出我加密的实际文本消息,但只能在非常具体的位置打印出来.相同的确切代码似乎无法在其他任何地方工作.这里是:
int n;
for(n = 0; n < numBlocks; n++) // Blocks are 32-bit unsigned ints (unsigned long)
{
// uchar is just a typedef for unsigned char
// message is an array of uchars
message[n] = (uchar) ((blocks[n]>>24));
message[n+1] = (uchar) ((blocks[n]>>16));
message[n+2] = (uchar) ((blocks[n]>>8));
message[n+3] = (uchar) ((blocks[n]));
// Printing works here; exact message comes back
printf("%c%c%c%c", message[n], message[n+1], message[n+2], message[n+3]);
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用两行完全相同的代码时,它不起作用.
for(n = 0; n < numBlocks; n++)
{
// Printing doesn't work here.
// Actually, the first letter works, but none of the others
printf("%c%c%c%c", message[n], message[n+1], message[n+2], message[n+3]);
}
Run Code Online (Sandbox Code Playgroud)
我也试过打印出数字格式的字符,我可以看到它们实际上已经改变了.
到底发生了什么?这是未定义的行为吗?有人有任何可靠的解决方案吗?我没有做任何事情来改变两个调用之间的消息数组的值.
我正在使用sparc处理器在Sun 5.10上运行并编译它.
for(n = 0; n < numBlocks; n++) // Blocks are 32-bit unsigned ints (unsigned long)
{
message[n] = (uchar) ((blocks[n]>>24));
message[n+1] = (uchar) ((blocks[n]>>16));
message[n+2] = (uchar) ((blocks[n]>>8));
message[n+3] = (uchar) ((blocks[n]));
}
Run Code Online (Sandbox Code Playgroud)
每次进行此循环时,设置message[n]为message[n+3],然后将n递增1.这意味着你的第一次迭代套message[0],message[1],message[2]和message[3],那么你的第二台message[1],message[2],message[3]和message[4].所以基本上,你会在每次迭代时覆盖消息中除第一个字符之外的所有字符.
最有可能你需要做message4倍大,然后做:
message[n*4] = ...
message[n*4 + 1] = ...
Run Code Online (Sandbox Code Playgroud)