Pergunta

Eu quero levar o valor armazenado em um 32 bit unsigned int, colocá-lo em quatro caracteres e, em seguida, armazenar o valor inteiro de cada um desses caracteres em uma string.

Eu acho que a primeira parte é a seguinte:

char a = orig << 8;
char b = orig << 8;
char c = orig << 8;
char d = orig << 8;
Foi útil?

Solução

Se você realmente deseja extrair os bytes individuais em primeiro lugar:

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

Ou:

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];

Ou use uma união de um sem assinatura de comprimento e quatro caracteres:

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.

Update: como friol apontou, soluções 2 e 3 não são endianness agnóstico; que bytes a, b, c e d representam depender da arquitetura de CPU.

Outras dicas

Vamos dizer "orig" é uma variável de 32 bits que contém o seu valor.

Eu imagino que você quer fazer algo como isto:

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);

Eu não tenho certeza que isso é sempre endian correta, pelo caminho. ( Editar : na verdade, é endian correta, já que as operações bitshift não deve ser afectado pela ordenação)

Espero que isso ajude.

Use um union. (Conforme solicitado aqui é o programa de exemplo.)

    #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;
    }

Como James mencionou isto é plataforma específica.

Não é bem assim:

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

Não é exatamente certo o que você quer dizer com "armazenar os valores inteiros de cada um desses valores em uma string. Você quer sua vez 0x10111213 em "16 17 18 19", ou o quê?

Para hexadecimal:

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

Para decimal:

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

Use snprintf para evitar um estouro de buffer.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top