JavaA2Z

KAB-studio > プログラミング > JavaA2Z > ダンプとは

ダンプ

日本語 ごみ吐き
英語 dump
ふりがな だんぷ
フリガナ ダンプ

解説

メモリの内容を全く変換・加工せずに出力したもの。
デバッグ用の情報のひとつ。
メモリ上の情報が文字列整数値の場合、それを出力しようとすると、必ず「文字列として出力」「整数値として出力」されることになり、それはメモリ上の内容を加工したものとなる。
この出力結果がおかしい場合に、「メモリ上に格納されている本物のデータ」が必要となっても、やはりこれを出力すると「文字列として出力」「整数値として出力」されてしまい、必要な情報が得られない。
そこで、「メモリ上に格納されている本物のデータ」を、そのままの形で出力したものが「ダンプ」である。
 
ダンプはバイナリーデータであり、見る時には16進形式で表示させる。
どこからどこまでがどの変数か、といった情報や、その情報がどういった意味を持つのか、といったことは分かりやすく書かれていない。何かのツールを使用して変換するか、脳内変換することで読み解く必要があり、そこには経験やノウハウが必要となるため、上級者向けと言える。
最近ではEclipseのように開発環境が充実しており、デバッグが簡単にえるため、ダンプの必要性は少ない。
 
Javaで最も使用されるダンプは「Stringクラスの16進ダンプ」である。
文字化けが起きた際に「Stringクラスの中に実際にはどのようなデータが格納されているのか」を出力するため、Stringクラスの1文字ずつを16進形式で出力する。これを「16進ダンプ」と言う。
文字化けの原因は、文字化け後の文章を見ても分からないため、原因究明にはこの16進ダンプが必要不可欠である。

参考サイト

  • (参考サイトはありません)

(KAB-studioからのおしらせです)

サンプルプログラム(とか)サンプルを別ウィンドウで表示サンプルをクリップボードへコピー(WindowsでIEの場合のみ)

// 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();
            forint 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();
        }
    }
}

この単語を含むページ

「みだし」に含まれているページ

「解説」に含まれているページ

「サンプルプログラムとか」に含まれているページ

はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
Yahoo!ブックマーク 詳細を表示 users
del.icio.us 登録する RSSに登録
サンプルを別ウィンドウで表示
サンプルをクリップボードへコピー(WindowsでIEの場合のみ)
update:2005/08/16
このページは、Javaプログラミング言語についての用語を網羅した辞書「JavaA2Z」の一ページです。
詳しくは「JavaA2Z」表紙の説明をご覧ください。