Как получить целочисленное значение символа в C ++? - PullRequest
4 голосов
/ 07 октября 2008

Я хочу взять значение, хранящееся в 32-битном целом без знака, поместить его в четыре символа и затем сохранить целочисленное значение каждого из этих символов в строке.

Я думаю, что первая часть выглядит так:

char a = orig << 8;
char b = orig << 8;
char c = orig << 8;
char d = orig << 8;

Ответы [ 5 ]

10 голосов
/ 07 октября 2008

Если вы действительно хотите сначала извлечь отдельные байты:

unsigned char a = orig & 0xff;
unsigned char b = (orig >> 8) & 0xff;
unsigned char c = (orig >> 16) & 0xff;
unsigned char d = (orig >> 24) & 0xff;

Или:

unsigned char *chars = (unsigned char *)(&orig);
unsigned char a = chars[0];
unsigned char b = chars[1];
unsigned char c = chars[2];
unsigned char d = chars[3];

Или используйте объединение длинных без знака и четырех символов:

union charSplitter {
    struct {
        unsigned char a, b, c, d;
    } charValues;

    unsigned int intValue;
};

charSplitter splitter;
splitter.intValue = orig;
// splitter.charValues.a will give you first byte etc.

Обновление: как указал фриол, решения 2 и 3 не являются независимыми от порядка байтов; количество байтов a, b, c и d зависит от архитектуры процессора.

10 голосов
/ 07 октября 2008

Допустим, "orig" - это 32-битная переменная, содержащая ваше значение.

Я полагаю, вы хотите сделать что-то вроде этого:

unsigned char byte1=orig&0xff;
unsigned char byte2=(orig>>8)&0xff;
unsigned char byte3=(orig>>16)&0xff;
unsigned char byte4=(orig>>24)&0xff;

char myString[256];
sprintf(myString,"%x %x %x %x",byte1,byte2,byte3,byte4);

Кстати, я не уверен, что это всегда правильно. ( Редактировать : действительно, он является прямым порядком байтов, так как на операции битового сдвига не должен влиять порядок байтов)

Надеюсь, это поможет.

4 голосов
/ 07 октября 2008

Используйте union. (В соответствии с запросом приведен пример программы.)

    #include <<iostream>>
    #include <<stdio.h>>
    using namespace std;

    union myunion
    {
       struct chars 
       { 
          unsigned char d, c, b, a;
       } mychars;

        unsigned int myint; 
    };

    int main(void) 
    {
        myunion u;

        u.myint = 0x41424344;

        cout << "a = " << u.mychars.a << endl;
        cout << "b = " << u.mychars.b << endl;
        cout << "c = " << u.mychars.c << endl;
        cout << "d = " << u.mychars.d << endl;
    }

Как упоминал Джеймс, это зависит от платформы.

1 голос
/ 07 октября 2008

Не совсем:

char a = orig & 0xff;
orig >>= 8;
char b = orig & 0xff;
orig >>= 8;
char c = orig & 0xff;
orig >>= 8;
char d = orig & 0xff;

Не совсем уверен, что вы подразумеваете под "сохранить целочисленные значения каждого из этих значений в строку. Вы хотите превратить 0x10111213 в "16 17 18 19", или как?

0 голосов
/ 07 октября 2008

Для шестнадцатеричного:

sprintf(buffer, "%lX", orig);

Для десятичного числа:

sprintf(buffer, "%ld", orig);

Используйте snprintf, чтобы избежать переполнения буфера.

...