Converter inteiro em hexadecimal e vice-versa


461

Como posso converter o seguinte?

2934 (inteiro) a B76 (hex)

Deixe-me explicar o que estou tentando fazer. Eu tenho IDs de usuário no meu banco de dados que são armazenados como números inteiros. Em vez de fazer com que os usuários façam referência a seus IDs, quero permitir que eles usem o valor hexadecimal. O principal motivo é porque é mais curto.

Portanto, não só preciso ir de número inteiro para hexadecimal, mas também preciso ir de hexa para número inteiro.

Existe uma maneira fácil de fazer isso em c #?


65
Para sua informação, você estará ofendendo os usuários do teclado numérico.
21339 Daniel A. White

1
Você tem um bom argumento. Mas estamos tentando converter o ID inteiro em algo que ocupe menos caracteres. Obrigado pela compreensão tho.
Codette 16/07/09

Uma resposta atrasada na moda, mas você considerou algum tipo de Integerredução da implementação? Se o único objetivo é tornar o ID do usuário o mais curto possível, eu estaria interessado em saber se existe algum outro motivo aparente pelo qual você exija especificamente a conversão hexadecimal - a menos que eu errei, é claro. É claro e conhecido (se necessário) que os IDs do usuário são de fato uma representação hexadecimal do valor real?
WynandB 17/10/10

1
Armazenar números como números ocupará menos espaço enquanto ainda estiver legível. Por exemplo, 4 bytes para números de até 2bln (número inteiro). Ou, se for muito longo para qualquer tipo numérico, use um campo binário.
Luc

9
@Luc O OP afirma que eu tenho IDs de usuário no meu banco de dados que são armazenados como números inteiros. Em vez de fazer com que os usuários façam referência a seus IDs, quero permitir que eles usem o valor hexadecimal. portanto, o codette está armazenando os valores como um int, mas convertendo para / do hex para o usuário.
Trisped

Respostas:


854
// Store integer 182
int intValue = 182;
// Convert integer 182 as a hex in a string variable
string hexValue = intValue.ToString("X");
// Convert the hex string back to the number
int intAgain = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);

de http://www.geekpedia.com/KB8_How-do-I-convert-from-decimal-to-hex-and-hex-to-decimal.html


179
você também pode especificar o número de dígitos usando: decValue.ToString ("X4")
Martin

78
Uma vez que este não foi mencionado aqui: Se você usar um quanto minúsculas x (por exemplo ToString ( "x4), obtém um valor hexadecimal minúsculas (por exemplo, B76).
Skalli

14
Eu sou o único com dificuldades para tolerar o nome da variável "decValue", pois não é um decimal? Desculpe cara, eu sei que é de outra fonte, mas o stackoverflow deve ser melhor que isso.
9309 Christopher Bonitz

8
@bonitzenator lol, nos 6 anos em que essa resposta existe, eu nunca percebi isso. Atualizada!
Gavin Miller

1
Observe que sua solução hex para int produzirá números inteiros SIGNED e atingirá o máximo de 8 caracteres hexadecimais.
Scott Solmer


60

Tente o seguinte para convertê-lo em hexadecimal

public static string ToHex(this int value) {
  return String.Format("0x{0:X}", value);
}

E de volta

public static int FromHex(string value) {
  // strip the leading 0x
  if ( value.StartsWith("0x", StringComparison.OrdinalIgnoreCase)) {
    value = value.Substring(2);
  }
  return Int32.Parse(value, NumberStyles.HexNumber);
}

Não tenho muita certeza por que eu merecia -1, mas acho que ofendi alguém.
JaredPar 16/07/2009

9
ou o bit "0x", que é algo que o OP realmente não queria #
Philippe Leybaert 16/07/09

3
Corrigi a ortografia do formato - mas não reduzi o voto. downvotes com nenhuma explicação me fazer mal-humorado também ...
Scott Ivey

@ Philippe, talvez, mas parece uma coisa muito boba a ser votada. Especialmente considerando metade das respostas originalmente não têm o hex -> parte int
JaredPar

8
(Me desculpe, já comentei). A questão era "como faço para converter 2934 em B76". Outras respostas de fato forneceram apenas metade da solução, mas você converteu "2934" para "0xB76". Não é uma solução ruim, mas não é uma resposta para a pergunta que foi feita.
Philippe Leybaert 16/07/2009

20
int valInt = 12;
Console.WriteLine(valInt.ToString("X"));  // C  ~ possibly single-digit output 
Console.WriteLine(valInt.ToString("X2")); // 0C ~ always double-digit output

19
string HexFromID(int ID)
{
    return ID.ToString("X");
}

int IDFromHex(string HexID)
{
    return int.Parse(HexID, System.Globalization.NumberStyles.HexNumber);
}

Eu realmente questiono o valor disso, no entanto. Seu objetivo declarado é reduzir o valor, o que será, mas isso não é um objetivo em si. Você realmente quer facilitar a lembrança ou a digitação.

Se você quer dizer mais fácil de lembrar, está dando um passo atrás. Sabemos que ainda é do mesmo tamanho, apenas codificado de forma diferente. Mas seus usuários não saberão que as letras estão restritas a 'A-F' e, portanto, o ID ocupará o mesmo espaço conceitual para eles, como se a letra 'AZ' fosse permitida. Portanto, em vez de memorizar um número de telefone, é mais como memorizar um GUID (de comprimento equivalente).

Se você quer dizer digitar, em vez de poder usar o teclado, o usuário agora deve usar a parte principal do teclado. É provável que seja mais difícil digitar, porque não será uma palavra que seus dedos reconheçam.

Uma opção muito melhor é deixá-los escolher um nome de usuário real.


O objetivo é realmente ocupar menos personagens. Veja o twitter, por exemplo, onde eles permitem apenas 140 mensagens de caracteres. Estamos fazendo algo semelhante e, portanto, estamos tentando oferecer a nossos usuários uma maneira de reduzir seu ID de usuário.
Codette 16/07/09

3
Nesse caso, você deve pensar em uma representação binária. É provável que seja um int de 32 bits que simplesmente não use a parte negativa, o que significa 16 bits de resolução. Você pode colocar isso em um caractere unicode com bastante facilidade.
Joel Coehoorn

5
Resposta tardia, mas - um int de 32 bits (assinado) que nunca contém números negativos tem 31 bits de resolução, não 16. Você pode colocar isso em um caractere unicode, mas quando é codificado em UTF8, a menos que esteja entre 0 e 127 vai ocupar mais caracteres do que o equivalente hexadecimal. HEX não é uma solução terrível para este problema, mas um base64 dos quatro bytes no int seria ainda mais curto (e você poderia cortar o estofamento)
James Hart

Sim, eu tive um peido cerebral ali. Eu gostaria de poder editar um comentário.
Joel Coehoorn

15

Para Hex:

string hex = intValue.ToString("X");

Para int:

int intValue = int.Parse(hex, System.Globalization.NumberStyles.HexNumber)

7

Eu criei minha própria solução para converter int para Hex string e vice-versa antes de encontrar esta resposta. Não é de surpreender que seja consideravelmente mais rápido que a solução .net, pois há menos sobrecarga de código.

        /// <summary>
        /// Convert an integer to a string of hexidecimal numbers.
        /// </summary>
        /// <param name="n">The int to convert to Hex representation</param>
        /// <param name="len">number of digits in the hex string. Pads with leading zeros.</param>
        /// <returns></returns>
        private static String IntToHexString(int n, int len)
        {
            char[] ch = new char[len--];
            for (int i = len; i >= 0; i--)
            {
                ch[len - i] = ByteToHexChar((byte)((uint)(n >> 4 * i) & 15));
            }
            return new String(ch);
        }

        /// <summary>
        /// Convert a byte to a hexidecimal char
        /// </summary>
        /// <param name="b"></param>
        /// <returns></returns>
        private static char ByteToHexChar(byte b)
        {
            if (b < 0 || b > 15)
                throw new Exception("IntToHexChar: input out of range for Hex value");
            return b < 10 ? (char)(b + 48) : (char)(b + 55);
        }

        /// <summary>
        /// Convert a hexidecimal string to an base 10 integer
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        private static int HexStringToInt(String str)
        {
            int value = 0;
            for (int i = 0; i < str.Length; i++)
            {
                value += HexCharToInt(str[i]) << ((str.Length - 1 - i) * 4);
            }
            return value;
        }

        /// <summary>
        /// Convert a hex char to it an integer.
        /// </summary>
        /// <param name="ch"></param>
        /// <returns></returns>
        private static int HexCharToInt(char ch)
        {
            if (ch < 48 || (ch > 57 && ch < 65) || ch > 70)
                throw new Exception("HexCharToInt: input out of range for Hex value");
            return (ch < 58) ? ch - 48 : ch - 55;
        }

Código de tempo:

static void Main(string[] args)
        {
            int num = 3500;
            long start = System.Diagnostics.Stopwatch.GetTimestamp();
            for (int i = 0; i < 2000000; i++)
                if (num != HexStringToInt(IntToHexString(num, 3)))
                    Console.WriteLine(num + " = " + HexStringToInt(IntToHexString(num, 3)));
            long end = System.Diagnostics.Stopwatch.GetTimestamp();
            Console.WriteLine(((double)end - (double)start)/(double)System.Diagnostics.Stopwatch.Frequency);

            for (int i = 0; i < 2000000; i++)
                if (num != Convert.ToInt32(num.ToString("X3"), 16))
                    Console.WriteLine(i);
            end = System.Diagnostics.Stopwatch.GetTimestamp();
            Console.WriteLine(((double)end - (double)start)/(double)System.Diagnostics.Stopwatch.Frequency);
            Console.ReadLine(); 
        }

Resultados:

Digits : MyCode : .Net
1 : 0.21 : 0.45
2 : 0.31 : 0.56
4 : 0.51 : 0.78
6 : 0.70 : 1.02
8 : 0.90 : 1.25

1

QUADRO LÍQUIDO

Muito bem explicado e poucas linhas de programação BOM TRABALHO

// Store integer 182
int intValue = 182;
// Convert integer 182 as a hex in a string variable
string hexValue = intValue.ToString("X");
// Convert the hex string back to the number
int intAgain = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);

PASCAL >> C #

http://files.hddguru.com/download/Software/Seagate/St_mem.pas

Algo da velha escola procedimento muito antigo de pascal convertido em c #

    /// <summary>
    /// Conver number from Decadic to Hexadecimal
    /// </summary>
    /// <param name="w"></param>
    /// <returns></returns>
    public string MakeHex(int w)
    {
        try
        {
           char[] b =  {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
           char[] S = new char[7];

              S[0] = b[(w >> 24) & 15];
              S[1] = b[(w >> 20) & 15];
              S[2] = b[(w >> 16) & 15];
              S[3] = b[(w >> 12) & 15];
              S[4] = b[(w >> 8) & 15];
              S[5] = b[(w >> 4) & 15];
              S[6] = b[w & 15];

              string _MakeHex = new string(S, 0, S.Count());

              return _MakeHex;
        }
        catch (Exception ex)
        {

            throw;
        }
    }

2
Obrigado pela resposta. Se possível, traduza para o inglês da melhor maneira possível. Não se preocupe com possíveis erros gramaticais, nós os corrigiremos.
bcperth


-5

int para hex:

int a = 72;

Console.WriteLine ("{0: X}", a);

hex para int:

int b = 0xB76;

Console.WriteLine (b);

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.