如何打印C中另一个函数使用的函数的参数?

时间:2014-05-25 17:02:04

标签: c string hash printing

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

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 = "0123456789abcdef";

    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的原因。

另外我想在switch-case中显示哈希输出。但是当我这样做时它会打印出来。那么如何打印哈希输出,如&#34; 4d741b6f1eb29cb2a9b9911c82f56fa8d73b04959d3d9d222895df6c0b28aa15&#34;?主要是:

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 个答案:

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

成为

free(hex)

移除digestInHex()末尾的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)&hex,以取hex main()

同样在free(hex)中,在返回前添加最终{{1}}。