Como faço para obter o valor inteiro de um caractere em C ++?
-
05-07-2019 - |
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;
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.