2017-04-19 107 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位整數範圍內)。