2008-10-07 2 views
4

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

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

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

Десятичный, восьмеричный, шестнадцатеричный или двоичный? – 2008-10-07 18:02:42

+0

Ваш вопрос и заголовок кажутся странными, и оба они менее точные. Можете ли вы повторить для большей ясности? – dmckee 2008-10-07 18:14:11

+0

Это кажется очень хрупким в международном контексте с unicode, где один символ на самом деле является кратным байтом ... – 2008-10-07 18:28:10

ответ

10

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

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 представляют собой зависимость от архитектуры ЦП.

1

Не совсем:

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

Как только у меня есть символы, я хочу напечатать их целочисленное значение – Clayton 2008-10-07 18:07:41

+0

@Clayton, повторив вопрос точно такими же словами в слегка другой порядок - это не то, что я называю «разъяснением» – 2008-10-07 18:15:17

0

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

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

десятичного:

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

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

+0

Или используйте потоковые операторы. Это было связано с вопросом C++. – 2008-10-07 18:09:17

4

Использовать 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; 
    } 

Как упоминал Джеймс, это специфичная для платформы.

10

Скажем, «ориг» - это 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); 

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

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

Смежные вопросы