簡體   English   中英

更改交流代碼以逐行工作

[英]Changing a c code to work line by line

#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

cat textfile | whirlpool_line_hash

我的理解是,我保留while循環(等待EOF ),並在收到10(0x0a)后進行哈希計算並打印。 需要重新設置打印哈希后,對嗎? 我根本不喜歡C,但是我需要一個快速的程序,所以我想用C來做。我已經無法將指針與整數進行比較了;-)有人可以幫忙嗎?

完成了;-)

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

它起作用,除了一個小小的警告, mhash_end返回的hash緩沖區是動態分配的緩沖區,因此最好在使用它后free它:

free(hash);

您可以使用fgets最多讀取一行。 就性能而言,每次讀取並饋入一個char可能不是最好的做法,相反,您可以讀取整行並將該區塊饋入hash函數以進行更新。 嘗試這個:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM