web-dev-qa-db-ja.com

C#から整数への16進数変換

次のものを変換するにはどうすればいいですか。

2934(整数)からB76(16進)

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

だから私は整数から16進数に行く必要があるだけでなく、16進数から整数に行く必要があります。

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

415
codette
// 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.co.jp/KB8_How-do-I-convert-from-decimal-to-hex- and-hex-to-decimal.html

782
Gavin Miller

つかいます:

int myInt = 2934;
string myHex = myInt.ToString("X");  // Gives you hexadecimal
int myNewInt = Convert.ToInt32(myHex, 16);  // Back to int again.

詳細と例については、「方法:16進文字列と数値型を変換する(C#プログラミングガイド)」を参照してください。

100
Scott Ivey

これを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);
}
52
JaredPar
string HexFromID(int ID)
{
    return ID.ToString("X");
}

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

私は本当にこれの価値に疑問を呈します。あなたは、目標は価値をより短くすることであると述べていますが、それは目標ではありません。あなたは本当に覚えやすくするか、またはタイプしやすくすることを意味します。

覚えやすいのであれば、後退しています。まだ同じサイズで、エンコードが異なるだけです。しかし、あなたのユーザーは、文字が 'A-F'に制限されていることを知らないので、IDは文字 'A-Z'が許可されているのと同じ概念上のスペースを占めます。つまり、電話番号を記憶するのではなく、GUID(同じ長さの)を記憶するのと同じです。

あなたがタイプすることを意味するならば、キーパッドを使うことができる代わりに、今ユーザーはキーボードの主要部分を使わなければなりません。それは彼らの指が認識する言葉ではないだろうから、それはタイプするのがより難しいだろう。

もっと良い選択肢は、実際にユーザー名を選択させることです。

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

六角へ:

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

Intへ:

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

この答えが見つかる前に、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
6
Eric Helms

お洒落な反応ですが、Integer短縮実装のようなものを検討しましたか?ユーザーIDをできるだけ短くすることが唯一の目的である場合、16進数の変換が特に必要な他の明白な理由があるかどうかを知りたいと思います - もちろんそれを見逃した場合を除きます。ユーザーIDが実際には実際の値を16進数で表したものであることは明確であり、(必要であれば)わかっていますか?

1
WynandB

NET FRAMEWORK

非常によく説明されており、プログラミングラインが少ない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;
        }
    }
0
JAAR

私はコメントを書くことはできませんが、intValue.ToString("X2")が「桁数を指定する」または「常に2桁の出力を生成する」という誤解を招くような誤解がある人もいます。これは真実ではない、2 最小 桁数を指定する。あなたが不透明な黒いARGB色を持っているのであれば、メソッドはFF000000ではなく00を生成します。

0
Pawcio

必要に応じて、ゼロ詰めで整数値を16進値で表示します。

int intValue = 1234;

Console.WriteLine("{0,0:D4} {0,0:X3}", intValue); 

https://docs.Microsoft.com/ja-jp/dotnet/standard/base-types/how-to-pad-a-number-with-leading-zeros

0
user3352769