gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:33:01 26 4
gpt4 key购买 nike

我需要在主函数中打印一个字符串(名为十六进制)。该字符串是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 函数。摘要InHex 中的十六进制字符串保留给定输入的哈希输出。

主要是我需要使用 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;
}

最佳答案

获取对分配的内存的引用并在下面设置 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)返回之前。

关于c - 如何在C中打印另一个函数使用的函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23857792/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com