search
LoginSignup
4

More than 3 years have passed since last update.

posted at

updated at

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

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

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

概要

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

文字列⇒16進

使用例

コンソール

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)のコード値で出力されます。

ソースコード

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のみ考慮)

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進⇒文字列 使用例


C:\xxx>HexToString "5169697461"
Qiita

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

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

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


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

参考サイト

UnicodeとUTF-16とUTF-8の違い

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
4