Преобразование Char в его Int-представление - PullRequest
1 голос
/ 17 января 2010

Я не вижу этой опции в таких вещах, как sprintf ().

Как бы я преобразовал букву F в 255? В основном обратная операция преобразования с использованием формата% x в sprintf?

Я предполагаю, что это что-то простое, что мне не хватает.

Ответы [ 4 ]

3 голосов
/ 17 января 2010

Используйте формат %x в sscanf !

3 голосов
/ 17 января 2010
char const* data = "F";
int num = int(strtol(data, 0, 16));

Посмотрите strtol и boost :: lexical_cast для более подробной информации и опций.

1 голос
/ 17 января 2010

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 голосов
/ 17 января 2010

Вы не можете заставить 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 путем расширения знака или дополнения нулями.Это сохраняет список параметров в стеке в разумном состоянии.Это хорошее соглашение, но, вероятно, оно возникло в 16-битной ориентации слова в стеке на PDP-11 (где все это началось).

В библиотеке printf (на приемном концеcall), код использует спецификатор формата, чтобы определить, какая часть параметра (или вся) обрабатывается.Поэтому, если формат «% c», используются только 8 бит.Обратите внимание, что между системами могут существовать некоторые различия в том, как «продвигаются» шестнадцатеричные константы.Но если значение, большее чем 255, передается в преобразование символов, старшие биты игнорируются.

...