ASCII文字列⇔文字コード(16進)変換してコンソールに出力するツール作った(C#)

ASCIIと16進の読み替えしたくなる場面があるので、C#で変換ツールつくった。

例によって`csc.exe`でコンパイルできます。
<b>Windowsならインストール不要で使えます。</b>
(`"C#" windows csc site:qiita.com` あたりのキーワードでググるべし)

# 概要

文字列をコマンドライン引数として与えると、文字コードの数値配列定義用に変換してコンソールに出力します。

# 文字列⇒16進

## 使用例

```text:コンソール

C:\xxx>StringToHex Qiita
Qiita
0x51, 0x69, 0x69, 0x74, 0x61,

C:\xxx>StringToHex あ
あ
0x3042,
```

ASCII以外も（用途として考慮していませんが）受け付けます。
`string`, `char`型は Unicode (UTF-16 LE) なので、Unicode (UTF-16 LE)のコード値で出力されます。

## ソースコード

```csharp:StringToHex.cs

using System;

class StringToHex
{
    [STAThread]
    static void Main(string[] args)
    {
        string s = String.Join(" ", args);
        Console.WriteLine(s);
        foreach(char c in s) {
            Console.Write("0x");
            Console.Write(((int)c).ToString("X2"));
            Console.Write(", ");
        }
        Console.WriteLine();
    }
}
```

## 16進⇒文字列

# 16進⇒文字列 ソースコード(ASCIIのみ考慮)

```csharp:HexToString.cs

using System;
using System.Text.RegularExpressions;

// 0x20-0x7Eは文字に変換。それ以外は <16進> で出力
// 先頭が x or X or 0x or 0X (正規表現 0?[xX]) の場合は読み捨てる。
// [0-9A-Fa-f]{2} を探す。

class HexToString
{
    [STAThread]
    static void Main(string[] args)
    {
        string instr = String.Join(" ", args).Trim();
        string[] ss = Regex.Split(instr, @"[-_ \t\r\n.,:;]+"); // 区切りとして扱う。

        Regex r = new Regex(@"^(?:0?[xX])?([0-9A-Fa-f]+)$");
        Regex rHexHex = new Regex(@"([0-9A-Fa-f]{2})");

        foreach(string s in ss) {
            if ( s == "" ) {
                continue;
            }
   
            Match m = r.Match(s);
            if (m.Success) {
                string hexStr = m.Groups[1].Value;
                if ( hexStr.Length%2 == 1 ) {
                    // 16進文字列の長さが 2 の倍数でない
                    Console.WriteLine();
                    Console.WriteLine("Error: Format hex-length unmatch!");
                    break;
                }
                MatchCollection mc = rHexHex.Matches(hexStr);
                foreach(Match mHexHex in mc) {
                    string hexhex = mHexHex.Groups[0].Value; // 2桁の16進文字列 ("12"とか"fc"とか)
                    int x = Convert.ToInt32(hexhex, 16);
                    Console.Write(MyConvertToChar(x));
                }
            }
            else {
                Console.WriteLine();
                Console.WriteLine("Error: Format unmatch!");
                break;
            }
            //Console.Write(", ");
        }
        Console.WriteLine();
    }

    static string MyConvertToChar(int x)
    {
        if ( 0x20 <= x && x <= 0x7E ) {
            return ((char)x).ToString();
        }
        //if ( x == (int)'\t' ) { return "\t"; }
        //if ( x == (int)'\r' ) { return "\r"; }
        //if ( x == (int)'\n' ) { return "\n"; }
        return "<"+x.ToString("X2")+">";
    }
}
```

## 16進⇒文字列 使用例

```text

C:\xxx>HexToString "5169697461"
Qiita

C:\xxx>HexToString "0x51, 0x69, 0x69, 0x74, 0x61,"
Qiita

C:\xxx>HexToString "11"
<11>
```

最後の例では、0x11 は可読文字ではないので `<11>` として出力させている。
`<`,`>`は 0x3C,0x3E なので以下と区別がつかないので、使うときは注意。

```text

C:XXX>HexToString "3c31313e"
<11>
```

# 参考サイト

[UnicodeとUTF-16とUTF-8の違い](https://itsakura.com/it-unicode-utf)