ファイル16進表示(C#/VB.NET)
2010年05月23日
ファイルを読み込みHEX(16進)形式で表示するサンプル(ソース/コード)です。バイナリエディタと同様の表示をする事が出来ます。ポイントは以下の通りです。
1.ファイルをバイト配列に読み込む
2.バイト配列を16進文字列(16バイト毎に改行)に変換
3.16進文字列を行単位の配列に変換
4.バイナリ16進表示
' -----------------------------------------------------------
' ファイルをバイナリ16進で表示するサンプル(VB.NET/VS2005)
Private Sub Button1_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button1.Click
' ファイルをバイト配列に読み込み
Dim bytDt() As Byte = ByteRead("D:\Temp\Test1.txt")
' バイト配列を16進文字列(16バイト毎に改行)に変換
Dim strDt As String = ByteToString(bytDt)
' 16進文字列を行単位の配列に変換
If strDt.Substring(strDt.Length - 1, 1) = vbLf Then
strDt = strDt.Substring(0, strDt.Length - 1)
End If
Dim strAr() As String = strDt.Split(vbLf)
' バイナリ16進表示
System.Diagnostics.Debug.Print("--")
For i As Integer = 0 To strAr.Length - 1
Debug.Print(strAr(i))
Next i
System.Diagnostics.Debug.Print("--")
End Sub
' ファイルをバイト配列で読み込み
Private Function ByteRead(ByVal fPath As String) As Byte()
Dim dt As Byte() = New Byte() {}
Dim sr As System.IO.Stream = Nothing
Dim br As System.IO.BinaryReader = Nothing
sr = System.IO.File.Open(fPath, _
System.IO.FileMode.Open, _
System.IO.FileAccess.Read)
br = New System.IO.BinaryReader(sr)
dt = New Byte(sr.Length - 1) {}
br.Read(dt, 0, dt.Length)
br.Close()
sr.Close()
Return dt
End Function
' バイト配列を16進文字列(16バイト毎に改行)に変換
Public Function ByteToString(ByRef bytDt() As Byte) As String
Const LBYT = 16
Dim sb As New System.Text.StringBuilder("")
For i As Integer = 0 To bytDt.Length - 1
Dim ival As Integer : ival = bytDt(i)
Dim sval As String
If ival < 16 Then
sval = "0" & Convert.ToString(ival, 16)
Else
sval = Convert.ToString(ival, 16)
End If
sb.Append(sval)
If ((i + 1) Mod LBYT) = 0 Then
sb.Append(vbLf)
End If
Next i
Return sb.ToString()
End Function
' -----------------------------------------------------------
// ----------------------------------------------------------
// ファイルをバイナリ16進で表示するサンプル(C#.NET/VS2005)
private void button1_Click(object sender, EventArgs e)
{
// ファイルをバイト配列に読み込み
Byte[] bytDt = ByteRead(@"D:\Temp\Test1.txt");
// バイト配列を16進文字列(16バイト毎に改行)に変換
String strDt = ByteToString(bytDt);
// 16進文字列を行単位の配列に変換
if( strDt.Substring(strDt.Length - 1, 1) == "\n" ){
strDt = strDt.Substring(0, strDt.Length - 1);
}
String[] strAr = strDt.Split('\n');
// バイナリ16進表示
System.Diagnostics.Debug.Print("--");
for (int i = 0; i <= strAr.Length - 1; i++)
{
System.Diagnostics.Debug.Print(strAr[i]);
}
System.Diagnostics.Debug.Print("--");
}
// ファイルをバイト配列で読み込み
private Byte[] ByteRead(String fPath)
{
Byte[] dt = new Byte[] { };
System.IO.Stream sr = null;
System.IO.BinaryReader br = null;
sr = System.IO.File.Open(fPath,
System.IO.FileMode.Open,
System.IO.FileAccess.Read);
br = new System.IO.BinaryReader(sr);
dt = new Byte[sr.Length];
br.Read(dt, 0, dt.Length);
br.Close();
sr.Close();
return dt;
}
// バイト配列を16進文字列(16バイト毎に改行)に変換
public String ByteToString(Byte[] bytDt)
{
const int LBYT = 16;
System.Text.StringBuilder sb =
new System.Text.StringBuilder("");
for (int i = 0; i <= bytDt.Length - 1; i++)
{
int ival = bytDt[i];
String sval;
if (ival < 16)
{
sval = "0" + Convert.ToString(ival, 16);
}
else
{
sval = "" + Convert.ToString(ival, 16);
}
sb.Append(sval);
if (((i + 1) % LBYT) == 0)
{
sb.Append("\n");
}
}
return sb.ToString();
}
// ----------------------------------------------------------