2017-04-19 55 views
-1

我有一个uint64值,我想转换成一个字符串,因为它必须被插入作为HTTP POST请求的有效载荷。UINT64串用C

我已经尝试了很多解决方案(ltoa,this解决方案),但我的问题仍然存在。

我的功能如下:

void check2(char* fingerprint, guint64 s_id) { 

    //stuff 
    char poststr[400] = "action=CheckFingerprint&sessionid="; 

    //convert s_id to, for example, char* myChar 
    strcat(poststr, myChar); 
} 

我想转换S_ID为char *。我已经试过:

1)char ses[8]; ltoa(s_id,ses,10)但我有一个分割故障;

2)char *buf; sprintf(buf, "%" PRIu64, s_id);

我工作的一个API的,所以我已经看到,当打印此guint64变量,它有以下形式:

JANUS_LOG(LOG_INFO, "Creating new session: %"SCNu64"\n", session_id); 
+1

问题是什么?为什么解决方案不起作用? – m13r

+0

“转换”是什么意思?将该值转换为ASCII字符串? – Tom

+2

'转换为'char *''是什么意思?你的意思是'char * cp =(char *)uint64_value;',还是你想将该数字转换为一个包含该值的十进制(十六进制,八进制?)数字的字符串? 'snprintf()'和'PRIu64'有什么问题?您应该尽力将其转换为MCVE([MCVE])。并询问你面临的问题。 –

回答

3

sprintf是正道使用无符号的64位格式说明符。

你需要为16个进制数字和空字节分配足够的空间。在这里,我分配20个字节,以适应领导0x以及然后我四舍五入它高达20比这感觉更好比19

char foo[20]; 
sprintf(foo, "0x%016" PRIx64, (uint64_t)numberToConvert); 

将打印数量的十六进制与领先0x其他没有很好的理由和前导零填充高达16.你不需要投如果numberToConvert已经是uint64_t

1

我有我想转换成char *,因为它必须被插入作为一个有效载荷的UINT64值HTTP POST请求。

你有什么是根本性的误解。

要插入值到文档中的文本表示,需要将其转换为字符序列的,这是一个指向字符(char *)完全不同的事情。其中一个选项似乎就是你真正想要的,就是将该值转换为C字符串形式的字符序列 - 即以空字符结尾的字符数组。然后,您可以获得或能够获得指向序列中第一个字符的指针。

这说明了什么不对的尝试性解决方案:

char *buf; 
sprintf(buf, "%" PRIu64, s_id); 

您正在尝试写你的号码存入数组的字符串表示指出,由buf但它不指向一个。尚未初始化或分配,其值是不确定的。

即使你的buf指向一个数组,数组的长度足以容纳该值的十进制表示的所有数字,再加上一个终止符。这可能是出了什么问题与您的其他尝试:

char ses[8]; ltoa(s_id,ses,10) 

无符号,64位二进制数可能需要多达20个十进制数字,再加上你需要空间终止。你所提供的数组还不够大,除非你可以确信你要写入的实际值不会超过9,999,999(这完全在32位整数范围内)。