0
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-11-03

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の違い

0
4
0

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
  3. You can use dark theme
What you can do with signing up
0
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?