MD5 加密的密码是 $1$12345678$blahblahblah
。 salt 是 1 之后的两个 $
符号之间的 8 位 key 。我如何提取这 8 个?
到目前为止,我已经有了 char *salt =
,我需要使其等于字符串的第十个索引。
最佳答案
您的问题包含“提取”一词,这有点复杂,因为不清楚您是否要将这 8 个字符复制到新缓冲区中,或者是否想要执行其他操作。
我可以想象,也许您只是想向控制台用户显示这 8 个字符。下面的代码完成了这个(但可能需要一些解释):
char *salt = "$1$12345678$blahblahblah";
int from = 3;
int to = 10;
int len = to-from+1;
printf("%.*s\n", len, salt+from);
Printf() 及其变体具有一些非常强大的字符串生成/操作功能。在本例中,我使用了“精度”说明符作为“s”转换的参数。如果为“s”转换指定了精度,则会限制发出的字符数。我通过“*”字符使用“len”以参数化方式提供此限制。如果您知道您总是想要从第 3 个字符开始发出 8 个字符(在 C 中我们总是从 0 开始计数,而不是从 1 开始),那么您的代码可以简化为下面给出的更简单的形式:
char *salt = "$1$12345678$blahblahblah";
printf("%.8s\n", salt+3);
最后,sprintf 可用于复制到另一个缓冲区。我将在下面给出此任务的简单形式(请注意,为了清楚起见,我更改了变量名称;您正在从一行密码文本中提取盐):
char *password = "$1$12345678$blahblahblah";
char salt[9]; /* Size of 9 required to hold terminating NULL byte */
sprintf(salt, "%.8s\n", password+3);
/* Now you can use salt for various purposes */
printf ("The salt is %s\n", salt);
关于c - C语言中如何从字符串中获取子字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23809919/