public static class Program
public static void Main()
string text = "012" + Environment.NewLine + "abc" + Environment.NewLine + "αβγ" + Environment.NewLine + "あいう";
var unicodeEncodings = new Encoding[] {
Encoding.BigEndianUnicode,
Console.WriteLine("Dumps byte sequence (Unicode):");
foreach (var encoding in unicodeEncodings)
text.DumpEncodedText(encoding);
Console.WriteLine(string.Empty);
Console.WriteLine("Dumps byte sequence with BOM (Unicode):");
foreach (var encoding in unicodeEncodings)
text.DumpEncodedTextStream(encoding);
Console.WriteLine(string.Empty);
var asciiEncodings = new Encoding[] {
Encoding.GetEncoding("iso-2022-jp"),
Encoding.GetEncoding("EUC-JP"),
Encoding.GetEncoding("shift_jis"),
Console.WriteLine("Dumps byte sequence (ASCII):");
foreach (var encoding in asciiEncodings)
text.DumpEncodedText(encoding);
Console.WriteLine(string.Empty);
Console.WriteLine("Dumps bit sequence (UTF-8):");
((char)0xFEFF).DumpUtf8Character();
foreach (var character in text)
character.DumpUtf8Character();
Console.WriteLine(string.Empty);
Console.WriteLine("Dumps hex sequence (ASCII):");
foreach (var character in new char[] { 'α', 'β', 'γ', 'あ', 'い', 'う' })
character.DumpAsciiCharacter();
public static void Dump<T>(this T value)
Console.WriteLine(value.ToString());
public static class SystemStringHelper
public static void DumpText(this string value)
Console.WriteLine("Original text:");
Console.WriteLine(value);
Console.WriteLine(string.Empty);
byte[] defaultBytes = value.ToUnicodeSystemByteSequence();
Console.WriteLine("{0, -30}{1}", "Hex Dump of system endian:", defaultBytes.ToHexString());
Console.WriteLine(string.Empty);
public static byte[] ToUnicodeSystemByteSequence(this char value)
return BitConverter.GetBytes(value);
public static byte[] ToUnicodeSystemByteSequence(this string value)
return value.ToCharArray().SelectMany(character => character.ToUnicodeSystemByteSequence()).ToArray();
public static byte[] ToUnicodeSwappedByteSequence(this char value)
byte[] bytes = value.ToUnicodeSystemByteSequence();
public static byte[] ToUnicodeSwappedByteSequence(this string value)
return value.ToCharArray().SelectMany(character => character.ToUnicodeSwappedByteSequence()).ToArray();
public static class EncodingHelper
public static void DumpEncodedText(this string value, Encoding encoding)
byte[] bytes = encoding.GetBytes(value);
bytes.DumpCharacters(encoding);
public static void DumpEncodedTextStream(this string value, Encoding encoding)
using (var stream = new MemoryStream())
using (var writer = new StreamWriter(stream, encoding))
stream.ToArray().DumpCharacters(encoding);
public static void DumpCharacters(this byte[] value, Encoding encoding)
Console.Write("{0, -20} ({1, 5}) ", encoding.EncodingName, encoding.CodePage);
Console.Write(value.ToHexString());
Console.WriteLine(string.Empty);
public static class Utf8Helper
public static void DumpUtf8Character(this char value)
string character = (value == 0xFEFF) ? "BOM" :
(value == 0x000D) ? "CR" :
(value == 0x000A) ? "LF" :
ushort code = Convert.ToUInt16(value);
byte[] swappedBytes = value.ToUnicodeSwappedByteSequence();
string swappedBytesHex = swappedBytes.ToHexString();
string splitBitSequence = string.Empty;
splitBitSequence = code.ToBinaryString().SetSeparator("-", new int[] { 7 });
splitBitSequence = code.ToBinaryString().SetSeparator("-", new int[] { 6, 11 });
else if (code < 0xD800 || 0xDFFF < code)
splitBitSequence = code.ToBinaryString().SetSeparator("-", new int[] { 6, 12 });
splitBitSequence = "not supported over U+FFFF characters...";
byte[] utf8Bytes = Encoding.UTF8.GetBytes(value.ToString());
string utf8BytesHex = utf8Bytes.ToHexString();
string utf8SplitBitSequence = string.Empty;
if (utf8Bytes.Length == 1)
utf8SplitBitSequence = utf8Bytes[0].ToBinaryString().SetSeparator("-", new int[] { 7 });
else if (utf8Bytes.Length == 2)
utf8SplitBitSequence = utf8Bytes[0].ToBinaryString().SetSeparator("-", new int[] { 5 });
utf8SplitBitSequence += " " + utf8Bytes[1].ToBinaryString().SetSeparator("-", new int[] { 6 });
else if (utf8Bytes.Length == 3)
utf8SplitBitSequence = utf8Bytes[0].ToBinaryString().SetSeparator("-", new int[] { 4 });
utf8SplitBitSequence += " " + utf8Bytes[1].ToBinaryString().SetSeparator("-", new int[] { 6 });
utf8SplitBitSequence += " " + utf8Bytes[2].ToBinaryString().SetSeparator("-", new int[] { 6 });
splitBitSequence = "not supported over U+FFFF characters...";
Console.Write("'{0}' Unicode: {1} (16) = {2} (2), UTF-8: {3} (16) = {4} (2)", character, swappedBytesHex, splitBitSequence, utf8BytesHex, utf8SplitBitSequence);
Console.WriteLine(string.Empty);
public static class AsciiHelper
public static void DumpAsciiCharacter(this char value)
var character = value.ToString();
var asciiEncodings = new Encoding[] {
Encoding.GetEncoding("iso-2022-jp"),
Encoding.GetEncoding("EUC-JP"),
Encoding.GetEncoding("shift_jis"),
byte[] jisBytes = asciiEncodings[0].GetBytes(character);
var jisRawBytes = jisBytes.SkipWhile(x => x != 0x1B).Skip(3).TakeWhile(x => x != 0x1B);
var jisHexString = jisRawBytes.ToArray().ToHexString();
var jisCodeString = jisRawBytes.Select(x => unchecked((byte)(x - 0x20))).ToArray().ToWordPointNumberString();
byte[] eucJpBytes = asciiEncodings[1].GetBytes(character);
var eucJpHexString = eucJpBytes.ToArray().ToHexString();
var eucJpCodeString = eucJpBytes.Select(x => unchecked((byte)(x - 0xA0))).ToArray().ToWordPointNumberString();
byte[] shiftJisBytes = asciiEncodings[2].GetBytes(character);
var shiftJisHexString = shiftJisBytes.ToArray().ToHexString();
if (0x80 < shiftJisBytes[0] && shiftJisBytes[0] < 0xA0)
upper = unchecked((byte)(shiftJisBytes[0] - 0x80));
else if (0xDF < shiftJisBytes[0] && shiftJisBytes[0] < 0xF0)
upper = unchecked((byte)(shiftJisBytes[0] - 0xDF + 0x1F));
if (0x3F < shiftJisBytes[1] && shiftJisBytes[1] < 0x7F)
wordNumber = unchecked((byte)((upper - 1) * 2 + 1));
pointNumber = unchecked((byte)(shiftJisBytes[1] - 0x3F));
else if (0x7F < shiftJisBytes[1] && shiftJisBytes[1] < 0x9F)
wordNumber = unchecked((byte)((upper - 1) * 2 + 1));
pointNumber = unchecked((byte)(shiftJisBytes[1] - 0x7F + 0x3F));
else if (0x9E < shiftJisBytes[1] && shiftJisBytes[1] < 0xFD)
wordNumber = unchecked((byte)((upper - 1) * 2 + 2));
pointNumber = unchecked((byte)(shiftJisBytes[1] - 0x9E));
var shiftJisCodeString = new byte[] { wordNumber, pointNumber }.ToWordPointNumberString();
Console.Write("'{0}' JIS: {1} ({2}), EUC-JP: {3} ({4}), Shift JIS: {5} ({6})", character, jisHexString, jisCodeString, eucJpHexString, eucJpCodeString, shiftJisHexString, shiftJisCodeString);
Console.WriteLine(string.Empty);
public static string ToWordPointNumberString(this byte[] value)
return string.Format("{0}-{1}", value[0], value[1]);
public static class HexStringHelper
public static string ToHexString(this byte[] value)
return BitConverter.ToString(value);
public static class BinaryStringHelper
public static string ToBinaryString(this byte value)
return Convert.ToString(value, 2).SetPadding(8);
public static string ToBinaryString(this byte value, int digits)
return Convert.ToString(value, 2).SetPadding(digits);
public static string ToBinaryString(this sbyte value)
return unchecked(((sbyte)value).ToBinaryString(8));
public static string ToBinaryString(this sbyte value, int digits)
return unchecked(((sbyte)value).ToBinaryString(digits));
public static string ToBinaryString(this ushort value)
return unchecked(((short)value).ToBinaryString(16));
public static string ToBinaryString(this ushort value, int digits)
return unchecked(((short)value).ToBinaryString(digits));
public static string ToBinaryString(this short value)
return Convert.ToString(value, 2).SetPadding(16);
public static string ToBinaryString(this short value, int digits)
return Convert.ToString(value, 2).SetPadding(digits);
public static string SetPadding(this string binaryString, int digits)
int length = binaryString.Length;
if (digits > length) return binaryString.Insert(0, new string('0', digits - length));
public static string SetSeparator(this string binaryString, string separator, int[] digitsList)
var result = binaryString;
int length = result.Length;
if (digitsList.Length > 0)
foreach (var digits in digitsList)
var position = length - digits;
if (position > 0) result = result.Insert(position, separator);