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>