2010-06-23 75 views
8

我有一個char* name這是我想要的短的字符串表示形式,如「15」,並需要將其輸出爲unsigned short unitId二進制文件。此演員陣容還必須是跨平臺兼容的。如何轉換char *爲無符號短C++

這是正確的投:unitId = unsigned short(temp);

請注意,我在理解二進制的初級水平。

+0

爲什麼你想要將指針的值存儲在文件中的第一個地方?你是否試圖將指向字符串的指針用作與數據庫中的主鍵類似的某種類型的UID?更多細節將會有所幫助。 – 2010-06-23 15:23:03

+0

我讀取一個二進制文件並解析它,然後轉換數據並將其輸出爲新的二進制格式。我也在使用遺留代碼。我真的只需要學習如何將char *轉換爲unsigned short。 – Elpezmuerto 2010-06-23 15:40:06

回答

14

我假設你char* name包含的一個字符串表示簡而言之,你想要的,即"15"

執行而不是char*直接投射到非指針類型。使用C語言進行轉換根本不會改變數據(有一些例外) - 它們只是通知編譯器,您想將一種類型轉換爲另一種類型。如果您將char*投射到unsigned short,那麼您將獲取指針(與內容無關)的值,切斷不適合short的所有內容,然後丟棄其餘的。這絕對不是你想要的。

而是使用std::strtoul功能,它解析字符串,並給你回同等數量:

unsigned short number = (unsigned short) strtoul(name, NULL, 0); 

(你還需要使用一個演員,因爲strtoul返回unsigned long這個轉換是兩個不同的間整數類型,不過,所以是有效的。可能發生的最糟糕的是,裏面name的數量太大,無法進入short --a情況,你可以檢查其他地方。)

+0

好吧,你必須首先檢查_before_分配給'number',例如首先分配一個無符號的long,然後檢查'USHRT_MAX'。 – 2017-11-21 21:29:57

2

該轉換會給你(截斷的)整數版本的指針,假設temp也是一個char *。這幾乎肯定不是你想要的(語法也是錯誤的)。看看atoi的功能,它可能是你需要的,例如unitId =(unsigned short)(atoi(temp)); 注意,這個假設(一)溫度爲指向的一串數字和(b)的數字代表一個數字,可以放入一個無符號短

9
#include <boost/lexical_cast.hpp> 

unitId = boost::lexical_cast<unsigned short>(temp); 
5

要在C++中將字符串轉換爲二進制文件,您可以使用stringstream。

#include <sstream> 

. . . 

int somefunction() 
{ 
    unsigned short num; 
    char *name = "123"; 
    std::stringstream ss(name); 

    ss >> num; 

    if (ss.fail() == false) 
    { 
     // You can write out the binary value of num. Since you mention 
     // cross platform in your question, be sure to enforce a byte order. 
    } 
} 
0

是在指針name的ID,或字符的字符串指向name?那如果name包含"1234",你需要輸出1234到文件中嗎?我會假設情況是這樣,因爲另一種情況下,你會用unitId = unsigned short(name)來做,當然是錯誤的。

然後你想要的是strtoul()函數。

char * endp 
unitId = (unsigned short)strtoul(name, &endp, 0); 
if (endp == name) { 
    /* The conversion failed. The string pointed to by name does not look like a number. */ 
} 

小心將二進制值寫入文件;做明顯事情的結果現在可能會奏效,但可能不會便攜。

0

如果你有一個數字的字符串(char * in C)表示,你必須使用適當的函數將該字符串轉換爲它所表示的數字值。

有幾個功能可以做到這一點。他們在這裏記錄: http://www.cplusplus.com/reference/clibrary/cstdlib