社区,我在C语言方面经验较少,目前正在学习过程中。
我正在开发一个小项目,涉及将一个32个字符的字符串分成四个包含8个字符的子串。这个32个字符的字符串应该类似于一个32位指令。这些“32位”被分成四个“8位”的字符串,我想要将其打印出来作为十六进制数。下面是我目前所得到的代码。我正在使用和我代码中其他部分相同的数据类型。我打算将unsigned char t
变量输入到一个替换盒程序中,该程序将从S-Box查找表中给出t
字符的等效值。
以下代码看起来对我来说应该可以正常工作。
unsigned char inst[] = "10101010101010101111111100111101";
unsigned char in[8];
for (int i = 0; i < 33; i++){
if (i%8 == 0 && i != 0) {
unsigned char t = (unsigned char) strtol(in, NULL, 2);
printf("%x \n", t);
}
in[i%8] = inst[i];
printf("%c ", in[i%8]);
}
但输出结果看起来像这样:
1 0 1 0 1 0 1 0 3d
1 0 1 0 1 0 1 0 3d
1 1 1 1 1 1 1 1 3d
0 0 1 1 1 1 0 1 3d
我看到
in[i%8] = inst[i];
这一行正确地从 inst[]
中读取了 chars
,但是……if (i%8 == 0 && i != 0) {
unsigned char t = (unsigned char) strtol(in, NULL, 2);
printf("%x \n", t);
}
条件语句打印错误的十六进制代码。 输出应该类似于以下内容:
1 0 1 0 1 0 1 0 aa
1 0 1 0 1 0 1 0 aa
1 1 1 1 1 1 1 1 ff
0 0 1 1 1 1 0 1 3d
非常感谢您的帮助。
unsigned char in[8]
更改为unsigned char in[9]
,并需要在使用strtol
之前在八个字符的字符串末尾添加空字符终止符。请参阅C语言教材中处理字符串的章节。 - Jabberwockyi == 8
时,首次调用strtol
-in
在迭代i == 0
到i == 7
期间被填充。 - user200783in
没有以NUL
结尾,因此strtol
会读取数组末尾之后的内容。 - user200783in[8]
初始化为 NUL? - user200783in[]
。干杯! - Ameer Shalabi