为什么打印无符号字符有时会起作用,有时不起作用?在C.

时间:2012-07-06 17:24:52

标签: c char printf unsigned 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]); 
}

但是当我尝试在两行之后使用完全相同的代码时,它不起作用

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]); 
}

我也试过以数字格式打印字符,我可以看到它们实际上已经改变了。

这到底发生了什么?这是未定义的行为吗?有人有任何可靠的解决方案吗?我没有做任何事情来改变两次调用之间的消息数组的值。

我正在使用sparc处理器在Sun 5.10上运行并编译它。

1 个答案:

答案 0 :(得分:9)

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]));
}

每次进行此循环时,都会将message[n]设置为message[n+3],然后将n增加1 。这意味着您的第一次迭代设置message[0]message[1]message[2]message[3],然后您的第二次设置message[1]message[2],{{1 }和message[3]。所以基本上,你会在每次迭代时覆盖消息中的第一个字符。

您很可能需要将message[4]大4倍,然后执行:

message