【问题标题】:How to print a parameter of a function which is used by another function in C?如何打印C中另一个函数使用的函数的参数?
【发布时间】:2014-07-14 11:59:07
【问题描述】:

我需要在主函数中打印一个字符串(命名为十六进制)。此字符串是 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 中显示哈希输出。但是当我这样做时它会打印 null 。那么如何打印像“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;
}

【问题讨论】:

    标签: c string hash printing


    【解决方案1】:

    要获得对分配的内存的引用,并在下面设置digestInHex()main(),请传递对指针hex 的引用。

    同时调整free()ing 以在它被(重新)分配之前但在它被打印之后释放它。

    为此调整代码如下:

    改变

    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) 的调用更改为&amp;hexhex

    还在main() 中添加最后一个free(hex),然后再返回。

    【讨论】:

      猜你喜欢
      • 2020-03-09
      • 1970-01-01
      • 2020-03-14
      • 2022-11-19
      • 2018-11-13
      • 2016-06-22
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      相关资源
      最近更新 更多