uint64到C中的字符串

时间:2017-04-19 13:53:02

标签: c unsigned-integer

我有一个uint64值,我想将其转换为字符串,因为它必须作为HTTP POST请求的有效负载插入。

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

我的功能如下:

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);

2 个答案:

答案 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位整数的范围内)。