2010-01-17 167 views
1

我在sprintf()等東西中沒有看到這個選項。將Char轉換爲其Int表示

如何將字母F轉換爲255?基本上是在sprintf中使用%x格式進行轉換的逆向操作?

我認爲這是簡單的我很想念。

+5

F = 15,FF = 255 – 2010-01-17 01:51:05

+0

有人要重命名此,他詢問如何從十六進制轉換爲一個int,而不是*字符表示的char * – 2010-01-17 02:35:08

+0

已修復。謝謝! :) – bobber205 2010-01-17 04:18:23

回答

3
char const* data = "F"; 
int num = int(strtol(data, 0, 16)); 

查找strtol和boost::lexical_cast瞭解更多詳情和選項。

3

sscanf中使用%x格式!

0

如果沒有一些黑魔法,你不能得到(s)printf將'F'轉換爲255。 Printf會將字符轉換爲其他表示,但不會更改其值。這可能顯示瞭如何字符轉換工作:

printf("Char %c is decimal %i (0x%X)\n", 'F', 'F', 'F'); 
printf("The high order bits are ignored: %d: %X -> %hhX -> %c\n", 
        0xFFFFFF46, 0xFFFFFF46, 0xFFFFFF46, 0xFFFFFF46); 

產生

Char F is decimal 70 (0x46) 
The high order bits are ignored: -186: FFFFFF46 -> 46 -> F 

是啊,我知道你問的sprintf,但不會告訴你任何東西,直到你做另一個打印。

這個想法是,每個通用的整數參數到一個printf放在堆棧(或在註冊表中)通過提升。這意味着它擴展到最大的通用尺寸:通過符號擴展或零填充將字節,字符和短褲轉換爲int。這使得堆棧上的參數列表保持合理狀態。這是一個很好的約定,但它可能源於PDP-11上的堆棧的16位字方向(它開始的地方)。

在printf庫(在調用的接收端),代碼使用格式說明符來確定參數(或全部參數)的哪部分被處理。所以如果格式爲'%c',則只使用8位。請注意,系統之間在如何「提升」十六進制常量方面可能存在一些差異。但是如果一個大於255的值被傳遞給字符轉換,高位被忽略。

1

的C++做的方式,與流:

#include <iomanip> 
#include <iostream> 
#include <sstream> 

int main() { 
    std::string hexvalue = "FF"; 
    int value; 
    // Construct an input stringstream, initialized with hexvalue 
    std::istringstream iss(hexvalue); 
    // Set the stream in hex mode, then read the value, with error handling 
    if (iss >> std::hex >> value) std::cout << value << std::endl; 
    else std::cout << "Conversion failed" << std::endl; 
} 

該程序打印255

+0

一個迂腐的解決方案不僅會檢查轉換是否成功,而且該iss具有eof標誌設置(沒有數據未被讀取)。我已經拋棄了這一點,因爲即使是非常基本的錯誤處理也必須令人困惑。 – Tronic 2010-01-17 04:35:40