我有一个uint64
值,我想将其转换为字符串,因为它必须作为HTTP POST请求的有效负载插入。
我已经尝试了很多解决方案(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);
答案 0 :(得分:4)
sprintf
是使用无符号64位格式说明符的正确方法。
您需要为16个十六进制数字和空字节分配足够的空间。在这里,我已经分配了20个字节来容纳一个前导0x
,然后我把它四舍五入到没有任何理由,除了感觉好于19。
char foo[20];
sprintf(foo, "0x%016" PRIx64, (uint64_t)numberToConvert);
将以十六进制格式打印前导0x
的数字,前导零填充最多16个。如果numberToConvert
已经是uint64_t
答案 1 :(得分:1)
我有一个uint64值,我想将其转换为char *,因为它必须作为HTTP POST请求的有效负载插入。
你所拥有的是一个根本的误解。
要将值的文本表示形式插入到文档中,需要将其转换为字符序列,这与指向字符的指针({{1}完全不同) })。您的选择之一,似乎就是您真正追求的,是将值转换为C字符串形式的字符序列 - 即以空字符结尾的字符数组。然后,您将拥有或能够获得指向序列中第一个字符的指针。
这解释了这个尝试的解决方案有什么问题:
df = pd.DataFrame(data_dict) print (df) A C E J 0 1 0 0.5 4 1 2 1 1.5 5 2 3 2 2.5 6 print (df.eval("A - J*2")) 0 -7 1 -8 2 -9 dtype: int64
您正尝试将数字的字符串表示形式写入char *
指向的数组,,但它不指向一个。没有被初始化或分配,它的价值是不确定的。
即使你的char *buf;
sprintf(buf, "%" PRIu64, s_id);
指向一个数组,数组必须足够长,以容纳值的十进制表示的所有数字,加上一个终结符。这可能是你的另一次尝试出了什么问题:
buf
无符号的64位二进制数可能需要最多20个十进制数字,而且您需要一个终结符空间。你提供的数组不够大,除非你可以确信你要写的实际值不会超过9,999,999(这完全在32位整数的范围内)。