2014-05-25 44 views
0

我需要在main函数中打印一个字符串(名为hex)。该字符串是digestInHex函数的参数,该函数用于keccak函数中。所以这里是功能:如何打印C中另一个函数使用的函数的参数?

void digestInHex(unsigned long long state[][5], unsigned char *buffer, 
       unsigned char *bufferLocation, int bufferSize, int size, char *hex) 
{ 
    unsigned char *byte; 
    int i, j; 
    unsigned long long *x; 

    const char *hexValues = "abcdef"; 

    byte = (unsigned char *)malloc(size * sizeof(char)); 

    hex = (char *)malloc(((size << 1) + 1) * sizeof(char)); 

    hex[size << 1] = '\0'; 

    /* Padding */ 
    bufferLocation[0] = 1; 
    ++bufferLocation; 

    while (bufferLocation != &buffer[bufferSize/8]) 
    { 
     bufferLocation[0] = 0; 
     ++bufferLocation; 
    } 

    buffer[(bufferSize >> 3) - 1] |= 0x80; 

    bufferLocation = buffer; 

    x = (unsigned long long *)buffer; 

    for (j = 0; j * 64 < bufferSize; ++j) 
    { 
     state[j/5][j % 5] |= x[j]; 
    } 

    round(state); 

    /* Squeezing */ 
    memcpy(byte, state, size); 
    reset(state); 

    bufferLocation = buffer; 

    for (i = 0; i < size; ++i) 
    { 
     hex[i << 1] = hexValues[byte[i] >> 4]; 
     hex[(i << 1) + 1] = hexValues[byte[i] & 15]; 
    } 

    free(byte); 

    // printf("%s\n", hex); 

    free(hex); 
} 

void keccak(const char *str, enum bitLength hashValueBitLength, char *hex) 
{ 
    int i = 0; 
    int j; 
    unsigned char *buffer; 
    unsigned char *bufferLocation; 
    const int bufferSize = 1600 - (hashValueBitLength * 2); 
    unsigned long long *x; 
    unsigned long long state[5][5]; 

    buffer = (unsigned char *)malloc(bufferSize * sizeof(char)); 
    bufferLocation = buffer; 

    reset(state); 

    while (str[i] != '\0') 
    { 
     bufferLocation[0] = (unsigned char)str[i]; 
     ++bufferLocation; 

     if (bufferLocation == &buffer[bufferSize/8]) 
     { 
      bufferLocation = buffer; 
      x = (unsigned long long *)buffer; 

      for (j = 0; j * 64 < bufferSize; ++j) 
      { 
       state[j/5][j % 5] |= x[j]; 
      } 

      round(state); 
     } 

     ++i; 
    } 

    digestInHex(state, buffer, bufferLocation, bufferSize, hashValueBitLength/8, hex); 

    free(buffer); 
} 

正如你所看到的,keccak函数在最后使用了digestInHex函数。 digestInHex中的十六进制字符串保留给定输入的哈希输出。

主要我需要使用switch-case来比较我的新旧项目的时间值。要做到这一点,我需要运行keccak 100万次才能看清时间差异。不能看到散列输出100万次,我无法直接在digestInHex中打印十六进制字符串,这就是为什么我在digestInHex中创建了十六进制注释的printf。

另外我想在开关柜中显示散列输出。但是当我这样做时它会打印出空白。那么我怎么能打印像“4d741b6f1eb29cb2a9b9911c82f56fa8d73b04959d3d9d222895df6c0b28aa15”哈希输出?下面是主要的:

int main() 
{ 
    int i; 
    clock_t begin, end; 
    double timeSpend; 
    int n; 

    printf("Enter 1 to see Old Project's time value\n"); 
    printf("Enter 2 to see New Project's time value\n\n"); 
    printf("Enter 3 to see Old Project's hash output\n"); 
    printf("Enter 4 to see New Project's hash output\n\n"); 
    printf("Please enter a value according to above: "); 

iterator: 

    scanf_s("%d", &n); 

    switch (n) 
    { 
    case 1: 
     begin = clock(); 
     for (i = 0; i < 1000000; ++i) 
      keccakOld("The quick brown fox jumps over the lazy dog", KECCAK_256, hexOld); 
     end = clock(); 
     timeSpend = (double)(end - begin)/CLOCKS_PER_SEC; 

     printf("%f sec.\n", timeSpend); 

     break; 

    case 2: 
     begin = clock(); 
     for (i = 0; i < 1000000; ++i) 
      keccak("The quick brown fox jumps over the lazy dog", KECCAK_256, hex); 
     end = clock(); 
     timeSpend = (double)(end - begin)/CLOCKS_PER_SEC; 

     printf("%f sec.\n", timeSpend); 

     break; 

    case 3: 
     keccakOld("The quick brown fox jumps over the lazy dog", KECCAK_256, hexOld); 
     printf("%s\n", hexOld); 

     break; 

    case 4: 
     keccak("The quick brown fox jumps over the lazy dog", KECCAK_256, hex); 
     printf("%s\n", hex); 

     break; 

    default: 
     printf("Please re-enter a correct value: "); 
     goto iterator; 

     break; 
    } 

    return 0; 
} 

回答

1

要得到分配,并在下面digestInHex()定下了到main()内存的引用传递一个参考指针hex

还调整free()在它被重新分配之前,但在它被打印之前释放它。

要做到如下这样调整代码:

变化

void digestInHex(unsigned long long state[][5], unsigned char* buffer, 
    unsigned char* bufferLocation, int bufferSize, int size, char* hex) 
{ 

成为

void digestInHex(unsigned long long state[][5], unsigned char* buffer, 
    unsigned char* bufferLocation, int bufferSize, int size, char ** hex) 
{ 
    free(*hex); 

digestInHex()末删除调用free(hex)

digestInHex()将所有hex更改为(*hex)

变化

void keccak(const char* str, enum bitLength hashValueBitLength, char* hex) 
{ 

成为

void keccak(const char* str, enum bitLength hashValueBitLength, char** hex) 
{ 

保留通话digestInHex()因为它是只使用hex

main()定义和初始化:

char * hex = NULL; 

更改为keccak()digestInHex)所有呼叫采取&hexhex

同样在main()在返回之前添加最后的free(hex)

相关问题