.NET開発者のためのブログメディア

C#で16進数に変換する方法とは?16進数の変換方法をご紹介!
- SE
- C#で10進数と16進数は相互変換できますか。
- PM
- できます。2進数やbyte配列とも16進数と相互変換できます。
目次
C#での16進数変換とは?
今回は様々な進数の数字を、C#で16進数と相互に変換する方法をご紹介します。
また、文字列が16進数か否かを判断する方法についても併せてご紹介しますので、C#での16進数変換方法に興味のある方は、是非ご覧ください。
16進数とは
「16進数」とは、それぞれの桁が16になると桁上りする数字を表します。0から9までの数字と、AからFまでのアルファベットの組み合わせで表現されます。
具体的には、以下のようになります。
10進数:16進数
1:1
2:2
3:3
4:4
5:5
6:6
7:7
8:8
9:9
10:A
11:B
12:C
13:D
14:E
15:F
16:10
17:11
18:12
19:13
20:14
C#では、普通に数字を並べると10進数として扱われますが、先頭に0x(または0X)を付けると16進数で扱われます。
具体的には、以下のように記載します。
var x = 0xFF;
var y = 0XA1;
また、C# 7.2で、””0x””の直後に区切り文字の””_””を入れることができるようになりました。
var x = 0x_FF;
var y = 0X_A1;
こうすることで、人の目で見ても分かりやすい表記になります。
10進数を16進数に変換
前述のとおり、C#では、10進数と16進数を相互に変換できます。以下に、実際のソースコードを見てみましょう。
プログラムの先頭に「using System;」と記載してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// 10進数を16進数に変換 Console.WriteLine(""10進数 : 16進数[ToString(\""x\"")] : 16進数[Convert.ToString]""); for(int i=0; i<=20; i++){ Console.WriteLine(i + "" : "" + i.ToString(""x"") + "" : "" + Convert.ToString(i, 16)); } // 16進数を10進数に変換 System.Console.WriteLine(""\n16進数 : 10進数""); for(int i=0; i<=20; i++){ var val_16 = i.ToString(""x""); Console.WriteLine(val_16 + "" : "" + Convert.ToString(Convert.ToInt32(val_16, 16), 10)); } |
実行結果は以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
10進数 : 16進数[ToString(""x"")] : 16進数[Convert.ToString] 0 : 0 : 0 1 : 1 : 1 2 : 2 : 2 3 : 3 : 3 4 : 4 : 4 5 : 5 : 5 6 : 6 : 6 7 : 7 : 7 8 : 8 : 8 9 : 9 : 9 10 : a : a 11 : b : b 12 : c : c 13 : d : d 14 : e : e 15 : f : f 16 : 10 : 10 17 : 11 : 11 18 : 12 : 12 19 : 13 : 13 20 : 14 : 14 16進数 : 10進数 0 : 0 1 : 1 2 : 2 3 : 3 4 : 4 5 : 5 6 : 6 7 : 7 8 : 8 9 : 9 a : 10 b : 11 c : 12 d : 13 e : 14 f : 15 10 : 16 11 : 17 12 : 18 13 : 19 14 : 20 |
ToString(“”x””)で16進数に変換できます。また、ToString(“”x4″”)と記述すると、0埋め4桁の16進数(0001など)に変換できます。
他には、Convertクラスを使っても16進数に変換できます。その場合は、第2引数に変換したい進数を指定します。
逆に、Convert.ToString()・Convert.ToInt32()を組み合わせると、16進数を10進数に変換できます。このような手順で、10進数と16進数の相互変換が可能になります。
2進数を16進数に変換
C#では、2進数と16進数も相互変換することができます。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// 2進数を16進数に変換 Console.WriteLine(""2進数 : 16進数""); for(int i=0; i<=20; i++){ var val_2 = Convert.ToString(i, 2); Console.WriteLine(val_2 + "" : "" + i.ToString(""x"")); } // 16進数を2進数に変換 System.Console.WriteLine(""\n16進数 : 2進数""); for(int i=0; i<=20; i++){ var val_16 = i.ToString(""x""); Console.WriteLine(val_16 + "" : "" + Convert.ToString(Convert.ToInt32(val_16, 16), 2)); } |
実行結果は以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
2進数 : 16進数 0 : 0 1 : 1 10 : 2 11 : 3 100 : 4 101 : 5 110 : 6 111 : 7 1000 : 8 1001 : 9 1010 : a 1011 : b 1100 : c 1101 : d 1110 : e 1111 : f 10000 : 10 10001 : 11 10010 : 12 10011 : 13 10100 : 14 16進数 : 2進数 0 : 0 1 : 1 2 : 10 3 : 11 4 : 100 5 : 101 6 : 110 7 : 111 8 : 1000 9 : 1001 a : 1010 b : 1011 c : 1100 d : 1101 e : 1110 f : 1111 10 : 10000 11 : 10001 12 : 10010 13 : 10011 14 : 10100 |
10進数の変換と同様に、Convert.ToString()やConvert.ToInt32()を組み合わせることで、2進数と16進数を相互に変換できます。
さらに、この仕組みを利用すれば、8進数と16進数の相互変換も可能になります。
byte型配列を16進数に変換
C#では、byte配列と16進数の相互変換も可能です。以下に、実際のソースコードを見てみましょう。
ソースコードの先頭に、
using System;
using System.Collections.Generic;
を記述してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// 16進数の文字列 var hexString = ""1A2B3C4D5E6F""; // 16進数をbyte配列に変換 var bitString = new List<byte>(); for (int i = 0; i < hexString.Length / 2; i++) { bitString.Add(Convert.ToByte(hexString.Substring(i*2, 2), 16)); } // byte配列を16進文字列に変換 string convertString = BitConverter.ToString(bitString.ToArray()); Console.WriteLine(convertString); // byte配列を16進文字列に変換し、""-""を削除 convertString = BitConverter.ToString(bitString.ToArray()).Replace(""-"", """"); Console.WriteLine(convertString); |
実行結果は以下のようになります。
1 2 |
1A-2B-3C-4D-5E-6F 1A2B3C4D5E6F |
BitConverterを使用することで、byte配列を16進文字列に変換できます。
この時、byte配列を16進文字列に変換すると、byte配列をハイフン (-) で結合した文字列として出力されます。なお、ハイフンはReplaceメソッドで置換(削除)されます。
16進数の判定
C#では、16進数か否かをUri.IsHexDigit()で判定します。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
// メイン関数 public static void Main(){ Console.WriteLine(IsHexString(""1a"")); Console.WriteLine(IsHexString(""0xaa"")); Console.WriteLine(IsHexString(""2s"")); Console.WriteLine(IsHexString(""01"")); } // 文字列が16進数か否かを判定する // 戻り値 // ・true: 16進数 // ・false: 16進数でない public static bool IsHexString(string str) { // 空文字は16進数ではない if (string.IsNullOrEmpty(str)) { return false; } // 先頭の0x(0X)を除く var s = str.Replace(""0x"", """").Replace(""0X"", """"); // 16進数の文字(0-9,a-f)以外が入っていいればfalse foreach (char c in s) { if (!Uri.IsHexDigit(c)){ return false; } } return true; } |
実行結果は以下のようになります。
1 2 3 4 |
True True False True |
このように、16進数か否かはUri.IsHexDigit()で判定することができます。
16進数の計算
C#では、16進数同士の計算もできます。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 |
// 16進数の四則演算 Console.WriteLine((0x10 + 0x02).ToString(""x"")); Console.WriteLine((0x10 - 0x02).ToString(""x"")); Console.WriteLine((0x10 * 0x02).ToString(""x"")); Console.WriteLine((0x10 / 0x02).ToString(""x"")); |
実行結果は以下のようになります。
1 2 3 4 |
12 e 20 8 |
このように、16進数同士の計算結果が16進数で表示されていることが分かります。
- SE
- C#では16進数か否かをUri.IsHexDigit()で判定するのですね。
- PM
- そうです。そのほか、16進数同士の計算もできますよ。
C#での16進数変換について理解しよう
この記事では、C#で10進数や2進数などの数字と、16進数とを相互に変換する方法をご紹介しましたが、いかがでしたでしょうか。
さらに、文字列が16進数か否かを判定する方法や、16進数同士の簡単な計算方法についてもご紹介しました。
実際にご自身でC#のソースコードを書いて、理解を深めて行きましょう。