首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将c代码逐行更改为工作代码

将c代码逐行更改为工作代码
EN

Stack Overflow用户
提问于 2016-05-09 10:01:04
回答 2查看 74关注 0票数 0
代码语言:javascript
复制
#include <mhash.h>
#include <stdio.h>
#include <stdlib.h>

int main(void)
 {
        int i;
        MHASH td;
        unsigned char buffer;
        unsigned char *hash;

        td = mhash_init(MHASH_WHIRLPOOL);

        if (td == MHASH_FAILED) exit(1);

        while (fread(&buffer, 1, 1, stdin) == 1) {
             mhash(td, &buffer, 1);
        }

        hash = mhash_end(td);

        for (i = 0; i < mhash_get_block_size(MHASH_WHIRLPOOL); i++) {
            printf("%.2x", hash[i]);
        }
        printf("\n");

        exit(0);
 }

嗨,我有上面的代码从mhash示例页面。我需要修改它,所以它将继续从stdin读取,并逐行计算哈希值,而不是等待EOF

代码语言:javascript
复制
cat textfile | whirlpool_line_hash

我的理解是,我保留while循环(等待EOF),并在收到10 (0x0a)后进行哈希计算和打印。打印后的mhash需要重置,对吗?我对C一点也不感兴趣,但我需要一个快速的程序,所以我想用C来实现它。我已经无法将指针与整数进行比较了;-)有人能帮忙吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-09 10:30:59

除了一个小小的警告之外,它可以工作,mhash_end返回的mhash_end缓冲区是一个动态分配的缓冲区,所以当您使用它时最好使用它:

代码语言:javascript
复制
free(hash);

您可以使用fgets,它最多只读取一行。就性能而言,每次读取和输入散列( char )可能不是最好的方法,相反,您可以读取整行并将块输入散列函数进行更新。试试这个:

代码语言:javascript
复制
char line[4096];
int len;
while (fgets(line, sizeof line, stdin) != NULL) { // read a line each time
    len = strlen(line);
    char *p = strrchr(line, '\n');
    if (p != NULL)
        mhash(td, line, len - 1);  // strip the new line
    else
        mhash(td, line, len);
}

hash = mhash_end(td);
for (i = 0; i < mhash_get_block_size(MHASH_WHIRLPOOL); i++) {
    printf("%.2x", hash[i]);
}
free(hash);
票数 1
EN

Stack Overflow用户

发布于 2016-05-09 10:25:24

做到了;-)

代码语言:javascript
复制
#include <mhash.h> //mhash
#include <stdio.h>
#include <stdlib.h> //exit
#include <unistd.h> //getopt


int main(void)
 {

        int i;
        MHASH td;
        unsigned char buffer;
        unsigned char *hash;

        td = mhash_init(MHASH_WHIRLPOOL);

        if (td == MHASH_FAILED) exit(1);

        while (fread(&buffer, 1, 1, stdin) == 1) { // read from stdin until receive EOF

        if ( buffer != '\n' ) { mhash(td, &buffer, 1); } //dont calculate line break
        if ( buffer == '\n' ) {  //received line break
        hash = mhash_end(td);

        for (i = 0; i < mhash_get_block_size(MHASH_WHIRLPOOL); i++) { printf("%.2x", hash[i]); }
        printf("\n");
        td = mhash_init(MHASH_WHIRLPOOL);

}
}
        exit(0);
 }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37112856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档