gpt4 book ai didi

c - 如何在 C 中处理这种字符串输出情况(不是 C++)

转载 作者:太空宇宙 更新时间:2023-11-04 03:51:35 25 4
gpt4 key购买 nike

我正在为加密货币编写的交易程序的后端工作,以访问各种交易所 API,为此,您需要提供一个 API key 和一个使用 sha512 和随机数进行 HMAC 处理的个人 secret key 获得独特的值(value),所有这些我都写了。我遇到的问题是 http header 的构造需要看起来像“符号:-128 字符 sha512 哈希在这里- key :-API key 在这里-”

我可以使用

将十六进制哈希输出到屏幕
printf( "\nHMAC digest: " );

for ( int i = 0; i != len; i++ )
{
printf( "%02x", (unsigned int)result[i] );
}
printf("\n");

看起来像这样:

HMAC digest: 67a73ea21e54379867e788f62b095f85603def7c82c0de9f0d02e19354627a140e8756e3c46d0d1d168df4a2cce305251b02c771234195cdd2574649faa01ce3

但是当我尝试将 header 字符串连接在一起以获得“Sign: -HMAC Digest here-”时,输出将显示“Sign: -garbled symbols here-”,我认为这是因为 printf 的格式为“% 02x”,但真正的问题是数据实际上在出现时被丢弃了,或者我只是没有正确地做一些事情来让它显示出来。

我目前正试图让它像这样打印出来:

char *header1 = "Sign: ";
char resBuffer[1024];
strcpy(resBuffer, header1 );

for( int i = 0; i != len; i++ )
{
resBuffer[i + strlen(header1)] = (unsigned int)result[i];
}

printf( "%s\n", resBuffer );

输出是:

�����%�q#A���WFI�� _�`=�|��ޟ

我尝试用 strcat( header1, result);但这最终给了我一个段错误,这种方式似乎正确地附加了数据但它不会正确打印(我认为这是由于“%s”格式化程序但我不知道如何在数组中拆分格式...... .

这是与我的问题相关的所有代码,明智的

// API settings, API key and secret key for your account
char key[] = "9498fbb723961a42816a10bc559cfda7ded2ed8e";
char secret[] = "687cd29def08a7861446c3b4b9c97996c8472e7dd8922da147d3b1343e52e99125d24ace90729fb3";

// method to use against the API, will make changable later
char *method = "mytrades";

// This is required to replace the microtime()/explode methods to
// generate the nonce value required to use the cryptsy API
struct timeval time;
gettimeofday( &time, NULL );
long mt = ( (unsigned long long)time.tv_sec * 1000000 ) + time.tv_usec;
// C is much more strict than PHP about types so we create a buffer for the
// string representation of the nonce
char mtStr[ 128 ];

sprintf( mtStr, "%lu", mt );

// C does not have a build_http_query as PHP does so
// we just create the string neccessary with strcpy
// and strcat
char post_data[ 1024 ];
strcpy( post_data, "method=" );
strcat( post_data, method );
strcat( post_data, "&" );
strcat( post_data, "nonce=" );
strcat( post_data, mtStr );

printf( "%s", post_data);
printf( "\n");

//sha512 needs 128 characters
unsigned char *result;
unsigned int len = 128;

result = (unsigned char *)malloc( sizeof(char) * len );

HMAC_CTX ctx;
HMAC_CTX_init( &ctx );

// using sha512
HMAC_Init_ex( &ctx, secret, strlen(secret), EVP_sha512(), NULL );
HMAC_Update( &ctx, (unsigned char *)&post_data, strlen(post_data) );
HMAC_Final( &ctx, result, &len );
HMAC_CTX_cleanup( &ctx );

printf( "\nHMAC digest: " );

for ( int i = 0; i != len; i++ )
{
printf( "%02x", (unsigned int)result[i] );
}
printf("\n");

char *header1 = "Sign: ";
char resBuffer[1024];
strcpy(resBuffer, header1 );

for( int i = 0; i != len; i++ )
{
resBuffer[i + strlen(header1)] = (unsigned int)result[i];
}


printf( "%s\n", resBuffer );


free(result);

我认为您不需要查看其余代码来告诉我我在这里做错了什么,它只是正常的 curl setopt 东西来访问站点,但那部分工作正常(对于 API 的部分不是需要身份验证。)

提前致谢!

最佳答案

由 2 个十六进制数字而不是单个字节组成字符串。

const char *header1 = "Sign: ";
size_t PrefixL = strlen(header1);
char resBuffer[PrefixL + 2*len + 1];
strcpy(resBuffer, header1);
char *p = &resBuffer[PrefixL];

for(unsigned int i = 0; i < len; i++) // I think OP wants < len and not != len
{
sprintf(p, "%02X", (unsigned int) result[i]);
p += 2;
}
printf("%s\n", resBuffer);

根据@alk 评论:
而不是像 sprintf(p, "%02X", (unsigned int) result[i]); 中那样的 OP 类型转换风格
使用 sprintf(p, "%02hhX", result[i]);
"hhX"匹配 result[i] 的类型( unsigned char )
这两种情况:
- 这个想法是为了防止像 0xFF 这样的值从打印为 "FFFFFFFF" .
- 2确保在 result[i] < 0x10 时至少打印 2 个字符, 根据需要填充。
- 0导致 '0'用于填充而不是空格。

关于c - 如何在 C 中处理这种字符串输出情况(不是 C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20296812/

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