c - C语言中如何从字符串中获取子字符串?

标签 c string encryption passwords md5

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/

相关文章:

Java从字符串解析为数字但推断类型

r - 计算字符串中出现在 R 字符串中特定位置的单词

Python, Unicode解码错误 : 'ascii' codec can't decode byte 0xc2 in position 1718: ordinal not in range(128)

c - 打印 malloc 的指针总是给出相同的地址

objective-c - Objective C 类方法与 C 函数

c - x86-64 结构中的数据对齐

java - "SecretKeyFactory not available"是什么意思?

ios - 在 KeyChain Access 中存储加密/解密 key 的可靠性?

php - 在 MySQL 中搜索加密数据的过滤器

c - 这个程序的输出是怎么出来的?