정수를 16 진수로 변환 한 후 다시 변환


461

다음을 어떻게 변환 할 수 있습니까?

2934 (정수)-B76 (16 진)

내가하려는 일을 설명하겠습니다. 데이터베이스에 정수로 저장된 사용자 ID가 있습니다. 사용자가 자신의 ID를 참조하도록하는 대신 16 진수 값을 사용하도록하고 싶습니다. 주된 이유는 더 짧기 때문입니다.

따라서 정수에서 16 진수로 이동해야 할뿐만 아니라 16 진수에서 정수로 이동해야합니다.

C #에서 이것을 수행하는 쉬운 방법이 있습니까?


65
참고로, 숫자 키패드 사용자에게 불쾌감을 줄 것입니다.
Daniel A. White

1
당신은 좋은 지적이 있습니다. 그러나 정수 ID를 더 적은 문자를 사용하는 것으로 변환하려고합니다. 통찰력에 감사드립니다.
codette

유행에 뒤 떨어진 응답이지만 일종의 Integer단축 구현 을 고려 했습니까? 사용자 ID를 가능한 한 짧게 만드는 것이 유일한 목표라면 물론 16 진 변환이 필요한 다른 명백한 이유가 있는지 알고 싶습니다. 사용자 ID가 실제로 실제 값의 16 진 표현이라는 것이 명확하고 알려져 있습니까 (필요한 경우)?
WynandB

1
@codette 숫자를 숫자로 저장하면 읽을 수있는 동안 공간을 가장 적게 차지합니다. 예를 들어, 최대 2bln (정수)의 숫자는 4 바이트입니다. 또는 숫자 유형에 비해 너무 길면 이진 필드를 사용하십시오.
Luc

9
@Luc OP는 데이터베이스에 정수로 저장된 사용자 ID가 있음을 나타냅니다 . 사용자가 자신의 ID를 참조하도록하는 대신 16 진수 값을 사용하도록하고 싶습니다. 그래서 코드는 값을 int로 저장하지만 사용자를 위해 16 진수로 변환하거나 16 진수로 변환합니다.
18:00에

답변:


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

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


179
다음을 사용하여 자릿수를 지정할 수도 있습니다. decValue.ToString ( "X4")
Martin

78
소문자 x (예 : ToString ( "x4))를 사용하면 소문자 16 진수 값 (예 : b76)을 얻습니다
Skalli

14
변수 이름 "decValue"를 허용하는 데 어려움을 겪는 유일한 사람입니까? 십진수가 아니기 때문입니까? 죄송합니다. 다른 소스에서 온 것으로 알고 있지만 스택 오버 플로우가 그보다 좋습니다.
크리스토퍼 보니 츠

8
@ bonitzenator lol, 6 년 동안이 답변이 존재했지만 결코 눈치 채지 못했습니다. 업데이트!
Gavin Miller

1
16 진수 대 정수 솔루션은 부호있는 정수를 생성하고 8 진수 문자를 최대로 사용합니다.
Scott Solmer


60

16 진수로 변환하려면 다음을 시도하십시오

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

그리고 다시

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

내가 왜 -1을 받아야하는지 잘 모르겠지만 누군가를 화나게 한 것 같습니다.
JaredPar

9
또는 OP가 실제로 원하지 않는 "0x"비트
Philippe Leybaert

3
형식 맞춤법을 수정했지만 하향 조정하지 않았습니다. 설명이없는 다운 보트도 저를 심술 make 게 만듭니다.
Scott Ivey

@Philippe, 아마도 공감해야 할 것은 매우 바보 같은 것 같습니다. 특히 원래 진수를하지 않았다 절반 답변을 고려 -> INT 부분
JaredPar

8
(이미 댓글을 달아 죄송합니다.) 문제는 "2934를 B76으로 변환하는 방법"이었습니다. 다른 답변은 실제로 솔루션의 절반 만 제공했지만 "2934"를 "0xB76"으로 변환했습니다. 전혀 나쁜 해결책은 아니지만 질문에 대한 답변이 아닙니다.
Philippe Leybaert

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

그래도 나는 이것의 가치에 의문을 갖는다. 목표는 가치를 더 짧게 만드는 것이며, 그 자체로는 목표가 아닙니다. 당신은 정말로 기억하기 쉽거나 타이핑하기 쉽다는 것을 의미합니다.

기억하기 쉽다는 의미라면 뒤로 물러서야합니다. 우리는 여전히 같은 크기이며 다르게 인코딩되었습니다. 그러나 사용자는 글자가 'A-F'로 제한되어 있다는 것을 알지 못하므로 문자 'AZ'가 허용되는 것처럼 ID는 동일한 개념 공간을 차지합니다. 따라서 전화 번호를 외우는 대신 GUID를 같은 길이로 외우는 것과 같습니다.

입력하려는 경우 키패드를 사용하는 대신 키보드의 주요 부분을 사용해야합니다. 손가락이 인식하는 단어가 아니기 때문에 입력하기가 더 어려울 수 있습니다.

더 나은 옵션은 실제로 실제 사용자 이름을 선택하도록하는 것입니다.


목표는 실제로 더 적은 문자를 사용하는 것입니다. 예를 들어 140 개의 문자 메시지 만 허용하는 트위터를 예로 들어 보자. 비슷한 작업을 수행하여 사용자에게 사용자 ID를 줄이는 방법을 제공하려고합니다.
codette

3
이 경우 이진 표현을 고려해야합니다. 이것은 16 비트 해상도를 의미하는 음수 부분을 사용하지 않는 32 비트 정수 일 가능성이 큽니다. 하나의 유니 코드 문자로 쉽게 넣을 수 있습니다.
Joel Coehoorn

5
뒤늦은 응답이지만 음수를 포함하지 않는 32 비트 (서명) int는 16 비트가 아닌 31 비트의 해상도를 갖습니다. 하나의 유니 코드 문자로 채울 수 있지만 UTF8로 인코딩 된 경우 0과 127 사이가 아닌 한 16 진 문자보다 많은 문자를 사용합니다. HEX는이 문제에 대한 끔찍한 해결책은 아니지만 int에서 4 바이트의 base64는 더 짧을 것입니다 (패딩을 다듬을 수 있습니다)
James Hart

네, 바로 뇌 방울이있었습니다. 의견을 편집 할 수 있으면 좋겠습니다.
Joel Coehoorn

15

16 진수로 :

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

int로 :

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

7

이 답변을 찾기 전에 int를 16 진수 문자열로 변환하고 다시 변환하는 자체 솔루션을 만들었습니다. 당연히 코드 오버 헤드가 적기 때문에 .net 솔루션보다 훨씬 빠릅니다.

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

타이밍 코드 :

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

결과 :

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

넷 프레임 워크

잘 설명되고 프로그래밍 라인이 거의 없음 GOOD JOB

// 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

구식 파스칼의 아주 오래된 절차에서 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
답장을 보내 주셔서 감사합니다. 가능하면 최대한 영어로 번역하십시오. 문법 오류에 대해 걱정하지 마십시오. 수정 해 드리겠습니다.
bcperth


-5

16 진수로 :

int a = 72;

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

16 진수 int :

int b = 0xB76;

Console.WriteLine (b);

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.