ダンプ
日本語 | ごみ吐き |
英語 | dump |
ふりがな | だんぷ |
フリガナ | ダンプ |
メモリの内容を全く変換・加工せずに出力したもの。
デバッグ用の情報のひとつ。
メモリ上の情報が文字列や整数値の場合、それを出力しようとすると、必ず「文字列として出力」「整数値として出力」されることになり、それはメモリ上の内容を加工したものとなる。
この出力結果がおかしい場合に、「メモリ上に格納されている本物のデータ」が必要となっても、やはりこれを出力すると「文字列として出力」「整数値として出力」されてしまい、必要な情報が得られない。
そこで、「メモリ上に格納されている本物のデータ」を、そのままの形で出力したものが「ダンプ」である。
ダンプはバイナリーデータであり、見る時には16進形式で表示させる。
どこからどこまでがどの変数か、といった情報や、その情報がどういった意味を持つのか、といったことは分かりやすく書かれていない。何かのツールを使用して変換するか、脳内変換することで読み解く必要があり、そこには経験やノウハウが必要となるため、上級者向けと言える。
最近ではEclipseのように開発環境が充実しており、デバッグが簡単に行えるため、ダンプの必要性は少ない。
Javaで最も使用されるダンプは「Stringクラスの16進ダンプ」である。
文字化けが起きた際に「Stringクラスの中に実際にはどのようなデータが格納されているのか」を出力するため、Stringクラスの1文字ずつを16進形式で出力する。これを「16進ダンプ」と言う。
文字化けの原因は、文字化け後の文章を見ても分からないため、原因究明にはこの16進ダンプが必要不可欠である。
デバッグ用の情報のひとつ。
メモリ上の情報が文字列や整数値の場合、それを出力しようとすると、必ず「文字列として出力」「整数値として出力」されることになり、それはメモリ上の内容を加工したものとなる。
この出力結果がおかしい場合に、「メモリ上に格納されている本物のデータ」が必要となっても、やはりこれを出力すると「文字列として出力」「整数値として出力」されてしまい、必要な情報が得られない。
そこで、「メモリ上に格納されている本物のデータ」を、そのままの形で出力したものが「ダンプ」である。
ダンプはバイナリーデータであり、見る時には16進形式で表示させる。
どこからどこまでがどの変数か、といった情報や、その情報がどういった意味を持つのか、といったことは分かりやすく書かれていない。何かのツールを使用して変換するか、脳内変換することで読み解く必要があり、そこには経験やノウハウが必要となるため、上級者向けと言える。
最近ではEclipseのように開発環境が充実しており、デバッグが簡単に行えるため、ダンプの必要性は少ない。
Javaで最も使用されるダンプは「Stringクラスの16進ダンプ」である。
文字化けが起きた際に「Stringクラスの中に実際にはどのようなデータが格納されているのか」を出力するため、Stringクラスの1文字ずつを16進形式で出力する。これを「16進ダンプ」と言う。
文字化けの原因は、文字化け後の文章を見ても分からないため、原因究明にはこの16進ダンプが必要不可欠である。
参考サイト
- (参考サイトはありません)
// Sample.java
import java.io.UnsupportedEncodingException;
// Sample.java
public class Sample
{
public static void main( String[] args )
{
try
{
// たとえば文字コード「シフトJIS」での「あいう」を……
byte[] source = new byte[] { (byte)0x82, (byte)0xA0, (byte)0x82, (byte)0xA2, (byte)0x82, (byte)0xA4 };
// Unicodeに変換せずにセットされてしまうと……
String string = new String( source, "ISO-8859-1" );
System.out.println( string );
// ???¢??
// 文字化けします。
// ただし、ここで出力されている「?」が、実際にstring変数の中に
// 格納されているわけではありません。
// 格納されている文字列を、println()メソッドが出力しようとして
// できなかったから代わりに「?」を出力しているだけです。
// そのため、デバッグする場合には、この中に入っている実際の文字列を
// 取得する必要があります。
// その場合、「16進ダンプ」を出力します。
// 16進数形式で「中身をそのまま出力する」ことで、中に何が入っているのか
// 調べます。
char[] chars = string.toCharArray();
for( int iF1 = 0; iF1 < chars.length; ++iF1 )
{
System.out.println( Integer.toHexString( chars[iF1] ) );
}
// 82
// a0
// 82
// a2
// 82
// a4
// この結果が、sourceの各要素と同じだということを確認してください。
// 慣れてくれば、この値から「シフトJISの『あいう』が入っている」
// ということが直感で分かったりもします。
// 文字化けしてる文字列は、StringクラスのgetBytes()メソッドの
// の引数に"ISO-8859-1"を渡してbyte型配列として取りだしたあと、
// 正しい文字コードで渡し直します。
byte[] bytes = string.getBytes( "ISO-8859-1" );
string = new String( bytes, "Shift_JIS" );
System.out.println( string );
// あいう
// ただし、これができるのは、
// String string = new String( source, "ISO-8859-1" );
// の箇所で"ISO-8859-1"を指定することで「全く変換せずにセットしている」
// ためです。
// もしこの時になんらかの文字コードを指定してしまっていると、
// 無理矢理変換してデータが壊れてしまうため、もう元には
// 戻りません。
}
catch( UnsupportedEncodingException e )
{
// StringクラスのコンストラクタがUnsupportedEncodingException例外を
// 投げるので拾います。第2引数で渡された文字コード
// (上記の例では「ISO-8859-1」や「Shift_JIS)が、Javaではサポート
// されていない文字コードの場合にエラーとなります。
e.printStackTrace();
}
}
}
import java.io.UnsupportedEncodingException;
// Sample.java
public class Sample
{
public static void main( String[] args )
{
try
{
// たとえば文字コード「シフトJIS」での「あいう」を……
byte[] source = new byte[] { (byte)0x82, (byte)0xA0, (byte)0x82, (byte)0xA2, (byte)0x82, (byte)0xA4 };
// Unicodeに変換せずにセットされてしまうと……
String string = new String( source, "ISO-8859-1" );
System.out.println( string );
// ???¢??
// 文字化けします。
// ただし、ここで出力されている「?」が、実際にstring変数の中に
// 格納されているわけではありません。
// 格納されている文字列を、println()メソッドが出力しようとして
// できなかったから代わりに「?」を出力しているだけです。
// そのため、デバッグする場合には、この中に入っている実際の文字列を
// 取得する必要があります。
// その場合、「16進ダンプ」を出力します。
// 16進数形式で「中身をそのまま出力する」ことで、中に何が入っているのか
// 調べます。
char[] chars = string.toCharArray();
for( int iF1 = 0; iF1 < chars.length; ++iF1 )
{
System.out.println( Integer.toHexString( chars[iF1] ) );
}
// 82
// a0
// 82
// a2
// 82
// a4
// この結果が、sourceの各要素と同じだということを確認してください。
// 慣れてくれば、この値から「シフトJISの『あいう』が入っている」
// ということが直感で分かったりもします。
// 文字化けしてる文字列は、StringクラスのgetBytes()メソッドの
// の引数に"ISO-8859-1"を渡してbyte型配列として取りだしたあと、
// 正しい文字コードで渡し直します。
byte[] bytes = string.getBytes( "ISO-8859-1" );
string = new String( bytes, "Shift_JIS" );
System.out.println( string );
// あいう
// ただし、これができるのは、
// String string = new String( source, "ISO-8859-1" );
// の箇所で"ISO-8859-1"を指定することで「全く変換せずにセットしている」
// ためです。
// もしこの時になんらかの文字コードを指定してしまっていると、
// 無理矢理変換してデータが壊れてしまうため、もう元には
// 戻りません。
}
catch( UnsupportedEncodingException e )
{
// StringクラスのコンストラクタがUnsupportedEncodingException例外を
// 投げるので拾います。第2引数で渡された文字コード
// (上記の例では「ISO-8859-1」や「Shift_JIS)が、Javaではサポート
// されていない文字コードの場合にエラーとなります。
e.printStackTrace();
}
}
}
// Sample.java import java.io.UnsupportedEncodingException; // Sample.java public class Sample { public static void main( String[] args ) { try { // たとえば文字コード「シフトJIS」での「あいう」を…… byte[] source = new byte[] { (byte)0x82, (byte)0xA0, (byte)0x82, (byte)0xA2, (byte)0x82, (byte)0xA4 }; // Unicodeに変換せずにセットされてしまうと…… String string = new String( source, "ISO-8859-1" ); System.out.println( string ); // ???¢?? // 文字化けします。 // ただし、ここで出力されている「?」が、実際にstring変数の中に // 格納されているわけではありません。 // 格納されている文字列を、println()メソッドが出力しようとして // できなかったから代わりに「?」を出力しているだけです。 // そのため、デバッグする場合には、この中に入っている実際の文字列を // 取得する必要があります。 // その場合、「16進ダンプ」を出力します。 // 16進数形式で「中身をそのまま出力する」ことで、中に何が入っているのか // 調べます。 char[] chars = string.toCharArray(); for( int iF1 = 0; iF1 < chars.length; ++iF1 ) { System.out.println( Integer.toHexString( chars[iF1] ) ); } // 82 // a0 // 82 // a2 // 82 // a4 // この結果が、sourceの各要素と同じだということを確認してください。 // 慣れてくれば、この値から「シフトJISの『あいう』が入っている」 // ということが直感で分かったりもします。 // 文字化けしてる文字列は、StringクラスのgetBytes()メソッドの // の引数に"ISO-8859-1"を渡してbyte型配列として取りだしたあと、 // 正しい文字コードで渡し直します。 byte[] bytes = string.getBytes( "ISO-8859-1" ); string = new String( bytes, "Shift_JIS" ); System.out.println( string ); // あいう // ただし、これができるのは、 // String string = new String( source, "ISO-8859-1" ); // の箇所で"ISO-8859-1"を指定することで「全く変換せずにセットしている」 // ためです。 // もしこの時になんらかの文字コードを指定してしまっていると、 // 無理矢理変換してデータが壊れてしまうため、もう元には // 戻りません。 } catch( UnsupportedEncodingException e ) { // StringクラスのコンストラクタがUnsupportedEncodingException例外を // 投げるので拾います。第2引数で渡された文字コード // (上記の例では「ISO-8859-1」や「Shift_JIS)が、Javaではサポート // されていない文字コードの場合にエラーとなります。 e.printStackTrace(); } } }