2013-01-21 39 views
1

反正有任何想法如何做到這一點?C++焦炭轉化爲int多字符常量

比方說,我有

char x[] = "ABCD"; 

,我希望把它變成一個int,因此我不得不

int y = 'ABCD'; 

我只能把單個字符,如int y = x[0];目的是找到十進制表示,但我想「ABCD」的十進制表示不只是「A」。

最後我會用sprintf(dest, "%.2u", value);得到字符的十進制表示。

編輯:

我不明白爲什麼,但對於「ABCD」這個代碼工作

//unrolled bit ops 
const char* x = "ABCD"; 
uint32_t y = 0; 
y |= (uint32_t(x[0]) << 24); //MSB 
y |= (uint32_t(x[1]) << 16); 
y |= (uint32_t(x[2]) << 8); 
y |= (uint32_t(x[3]) /*<< 0*/); 

然而,每個實例如果我使用「(¸þ¶」我沒有得到同樣的結果。

EDIT2 **。

我試過上次編輯山姆,但它仍然不工作我得到的值是「4294967294」,而不是「683212470」的正確值 我也做這個

int h1 = '('; 
int h2 = '¸'; 
int h3 = 'þ'; 
int h4 = '¶'; 

輸出:

40 
-72 
-2 
-74 

我GOOGLE了完整的ASCII表,我發現,對於「TH」的值是「254」。我想這與此有關......我也嘗試過使用但沒有好的結果。

EDIT3:如果我有int x[] = {40, 184, 254, 182};(每個字符的十進制表示更換const char *x = "(¸þ¶",它的工作原理我能理解不如意的事情,但我不知道如何解決它

+0

看看[這裏](http://stackoverflow.com/questions/1070497/c-convert-hex-string-to-signed-integer) –

+0

使用位移和按位或(和適當大小的無符號類型)。 –

+0

爲了防止你在程序中使用''(¸þ¶「'',它會中斷,因爲最後三個字符是多字節字符。編譯器應該吐出警告。這個問題涉及如何將特殊字符放入一個字符串文字:http://stackoverflow.com/q/2420780/1175253 – Sam

回答

4

你需要保證INT對齊對於字符數組一個適當的鑄造或做的memcpy成int類型。 也要照顧整數的字節序!此外,C99整數類型(如uint32_t)的使用,也將有助於使代碼的可移植性。

見這個問題如何轉換位: strict aliasing and alignment

編輯:

什麼R.Martinho費爾南德斯裝置,可能是這種(未測試):

//unrolled bit ops 
const char* x = "ABCD"; 
uint32_t y = 0; 
y |= (uint32_t(uint8_t(x[0])) << 24); //MSB 
y |= (uint32_t(uint8_t(x[1])) << 16); 
y |= (uint32_t(uint8_t(x[2])) << 8); 
y |= (uint32_t(uint8_t(x[3])) /*<< 0*/); 

以上示例避免了對於任何字節序

編輯2特定的代碼:

對於動態字符數組(假定前導零個字符如果小於4必須轉換):

const char* x = "ABC"; 
size_t nChars = 3; 

assert(0 < nChars && nChars <= sizeof(uint32_t)); 

uint32_t y = 0; 

int shift = (nChars*8)-8; 
for(size_t i = 0;i < nChars;++i) 
{ 
    y |= (uint32_t(uint8_t(x[i])) << shift); 
    shift -= 8; 
} 
+0

我試圖將memcpy插入int uint32_t x; \t memcpy(&x,value,4); –

+0

但我仍然得到錯誤的結果,當我sprintf它 –

+0

@AlexandruCalin @AlexandruCalin因爲你在處理內存,如果你想處理*數字*使用操作處理*數字*(位移) –

-1

我已經創建了一個示例程序,如果這是你想要的。

包括所需要的標題(stdio.h中,stdlib.h中,math.h中,string.h中)

unsigned long convertToInt(char *x); 

void main() {

char x[] = "ABCD"; 
unsigned long y = 0; 

y = convertToInt(x); 

printf("Numeric value = %lu\n", y); 

}

unsigned long convertToInt(char *x) {

unsigned long num = 0, i, n;` 
char hex_c; 

for(i = 0; i< strlen(x); i++) { 

    hex_c = x[i]; 

    if (hex_c >= '0' && hex_c <= '9') { 
    n = hex_c - '0'; 
    } else if (hex_c >= 'A' && hex_c <= 'F') { 
    n = 10 + hex_c - 'A'; 
    } else if (hex_c >= 'a' && hex_c <= 'f') { 
    n = 10 + hex_c - 'a'; 
    } else { 
     printf("Wrong input"); 
    return 0; 
    } 

    num += n * (pow(16, (strlen(x) - i - 1))); 
} 

return num; 

} 
+2

這不是關於轉換十六進制數字,這是關於獲取字符的數字表示。 'A'需要變成65而不是10,而「AB」將變成(65 * 256)+66 –