整数を16進数に変換し、再度戻す


461

以下をどのように変換できますか?

2934(整数)〜B76(16進数)

私がやろうとしていることを説明させてください。データベースに整数として格納されているユーザーIDがあります。ユーザーにIDを参照させるのではなく、16進値を使用させたい。主な理由はそれが短いからです。

したがって、整数から16進数に移動する必要があるだけでなく、16進数から整数に移動する必要もあります。

これをC#で行う簡単な方法はありますか?


65
ちなみに、あなたはテンキーのユーザーを怒らせます。
ダニエルA.ホワイト

1
あなたは良い点を持っています。ただし、整数IDを文字数の少ないものに変換しようとしています。洞察力をありがとう。
コデット2009

流行遅れの応答ですが、何らかのInteger短縮実装を検討しましたか?唯一の目標がユーザーIDをできるだけ短くすることである場合、16進数の変換が特に必要な他の明らかな理由があるかどうかを知りたいと思います。ユーザーIDが実際には実際の値の16進数表現であることは明らかで(必要な場合)ですか?
WynandB 2010年

1
@codette数値を数値として保存すると、読み取り可能でありながら最小のスペースしか使用しません。たとえば、最大2bln(整数)の場合は4バイト。または、数値型に対して長すぎる場合は、バイナリフィールドを使用します。
Luc

9
@Luc OPには、データベースにユーザーIDがあり、整数として格納されていると記載されています。ユーザーにIDを参照させるのではなく、16進値を使用させたい。したがって、コーデックは値をintとして格納しますが、ユーザーのために16進数との間で変換を行います。
Trisped

回答:


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"は10進数ではないので、許容できないのは私だけですか?申し訳ありませんが、私はそれが別のソースからのものであることを知っていますが、stackoverflowはそれよりも優れているはずです。
Christopher Bonitz、2015年

8
@bonitzenator lol、6年間でこの答えは存在しました、私はそれに気づいたことがありません。更新しました!
Gavin Miller

1
hex to intソリューションはSIGNED整数を生成し、8桁の16進数で最大になることに注意してください。
Scott Solmer 2016年


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 2009

9
または「0x」ビット、これはOPが実際に望まなかったものです
フィリップレイバート

3
形式のスペルを修正しましたが、反対投票はしませんでした。説明なしの反対投票も私を不機嫌にします...
Scott Ivey

@フィリップ、たぶんしかし、それは反対投票するのは非常にばかげているように思えます。特に、回答の半分を考慮すると、元々は16進数-> int部分がありませんでした
JaredPar

8
(コメントして申し訳ありません)。問題は、「2934をB76に変換する方法」でした。他の答えは確かにソリューションの半分しか提供しませんでしたが、あなたの「2934」は「0xB76」に変換されました。これは決して悪い解決策ではありませんが、尋ねられた質問に対する回答ではありません。
Philippe Leybaert、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);
}

しかし、私はこれの価値に本当に疑問を投げかけています。目標は値を短くすることであると言われていますが、それ自体は目標ではありません。覚えやすくするか、タイプしやすくするという意味です。

覚えやすいという意味であれば、後退しています。それでもサイズは同じで、エンコードが異なるだけです。しかし、ユーザーは文字が「A-F」に制限されていることを知らないため、IDは「AZ」の文字が許可されている場合と同じ概念的なスペースを使用します。つまり、電話番号を覚えるようなものではなく、GUID(同等の長さ)を覚えるようなものです。

タイプする場合、キーパッドを使用する代わりに、ユーザーはキーボードの主要部分を使用する必要があります。指が認識する単語ではないため、入力するのがより難しくなる可能性があります。

より良いオプションは、実際にユーザー名を選択させることです。


実際の目標は、使用する文字数を減らすことです。たとえば、140文字のメッセージしか許可されていないTwitterを例にとります。私たちは同様のことをしているので、ユーザーにユーザーIDを短縮する方法を提供しようとしています。
コペット2009

3
その場合、バイナリ表現について考える必要があります。これはおそらく負の部分を使用しない32ビット整数であり、16ビットの解像度を意味します。これを1つのUnicode文字にかなり簡単に入れることができます。
Joel Coehoorn、2009

5
遅延応答、ただし-負の数を決して含まない32ビット(符号付き)intの解像度は16ではなく31ビットです。それを1つのUnicode文字に詰め込むことはできますが、UTF8エンコードの場合、0から127の間でなければ相当する16進数よりも多くの文字を使用します。HEXはこの問題のひどい解決策ではありませんが、intの4バイトのbase64はさらに短くなります(そしてパディングをトリミングできます)
James Hart

ええ、私はすぐそこに頭がおならした。コメントを編集したいです。
Joel Coehoorn 2014年

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

パスカル>> 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 2018年


-5

16進数への整数:

int a = 72;

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

hex to int:

int b = 0xB76;

Console.WriteLine(b);

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.