Eu quero converter uma seqüência hexadecimal em um inteiro assinado de 32 bits em C ++.
Então, por exemplo, eu tenho a string hexadecimal "fffefffe". A representação binária disso é 11111111111111101111111111111110. A representação inteira assinada disso é: -65538.
Como faço essa conversão em C ++? Isso também precisa funcionar para números não negativos. Por exemplo, a sequência hexadecimal "0000000A", que é 000000000000000000000000000000001010 em binário e 10 em decimal.
int
. "32 bit inteiro assinado" poderia ser int32_t ou __int32 etc.Respostas:
usar
std::stringstream
o exemplo a seguir produz
-65538
como resultado:No novo padrão C ++ 11, existem algumas novas funções utilitárias que você pode usar! especificamente, há uma família de funções "string to number" ( http://en.cppreference.com/w/cpp/string/basic_string/stol e http://en.cppreference.com/w/cpp/string/ basic_string / stoul ). Trata-se de invólucros essencialmente finos em torno das funções de conversão de string para número, mas sabem como lidar com um
std::string
Portanto, a resposta mais simples para o código mais recente provavelmente seria assim:
NOTA: Abaixo está a minha resposta original, que, como diz a edição, não é uma resposta completa. Para uma solução funcional, cole o código acima da linha :-).
Parece que desde
lexical_cast<>
está definido para ter semântica de conversão de fluxo. Infelizmente, os fluxos não entendem a notação "0x". Então, tanto aboost::lexical_cast
mão quanto a minha mão rolada não lidam bem com cordas hexagonais. A solução acima, que define manualmente o fluxo de entrada como hexadecimal, lidará perfeitamente com isso.O Boost também tem algumas coisas para fazer isso, que também oferecem alguns recursos interessantes de verificação de erros. Você pode usá-lo assim:
Se você não gosta de usar o boost, aqui está uma versão leve do elenco lexical que não faz verificação de erro:
que você pode usar assim:
fonte
std::hex
stringstream
s, deve-se verificarss.good() && ss.eof()
se nenhum erro ocorreu.Para um método que funciona com C e C ++, você pode considerar o uso da função de biblioteca padrão strtol ().
fonte
strtoul
não deve usarstrtol
. Haverá+ overflow
ao usar strtol. Com,strtoul
não haverá excesso e o valor retornado será convertidolong
para produzir o resultado correto (-65538). Então, sua resposta quase certo :)Andy Buchanan, no que diz respeito ao C ++, gostei do seu, mas tenho alguns mods:
Usado como
Dessa forma, você não precisa de um impl impl por tipo.
fonte
Exemplo de trabalho com
strtoul
será:strtol
convertestring
paralong
. No meu computadornumeric_limits<long>::max()
dá0x7fffffff
. Obviamente, isso0xfffefffe
é maior que0x7fffffff
. Então,strtol
retorna emMAX_LONG
vez do valor desejado.strtoul
convertestring
paraunsigned long
é por isso que nenhum estouro neste caso.Ok,
strtol
está considerando a sequência de entrada não como um inteiro assinado de 32 bits antes da conversão. Exemplo engraçado comstrtol
:O código acima é impresso
-65538
no console.fonte
Aqui está um método simples e de trabalho que encontrei em outro lugar:
Observe que você pode preferir usar um número inteiro longo / inteiro longo não assinado para receber o valor. Outra observação, a função c_str () apenas converte o std :: string em const char *.
Portanto, se você tiver um const char * pronto, continue usando o nome da variável diretamente, como mostrado abaixo [Eu também estou mostrando o uso da variável longa não assinada para um número hexadecimal maior. Não confunda com o caso de ter const char * em vez de string]:
Isso funciona perfeitamente bem (desde que você use tipos de dados apropriados de acordo com sua necessidade).
fonte
Eu tive o mesmo problema hoje, eis como o resolvi para que eu pudesse continuar lexical_cast <>
(Encontrei esta página quando estava procurando uma maneira menos chata :-)
Cheers, A.
fonte
Isso funcionou para mim:
fonte
Tente isso. Esta solução é um pouco arriscada. Não há cheques. A sequência deve ter apenas valores hexadecimais e o comprimento da sequência deve corresponder ao tamanho do tipo de retorno. Mas não há necessidade de cabeçalhos extras.
Uso:
Nota: o comprimento da string deve ser divisível por 2
fonte