###前提・実現したいこと
ファイルダンププログラムを作成しているのですが、漢字が正しく表示できないです。
###発生している問題・エラーメッセージ
一部が文字化けしてしまう
###該当のソースコード
C言語
1typedef struct _DumpData{ 2 unsigned char fileName[MAX]; //ファイル名 3 unsigned char data[MAX]; //読み込んだデータ 4 long size; //ファイル容量 5 int contents; //freadの戻り値 6 int blockSize; //ブロックサイズ 7 int totalBlock; //総ブロック数 8 FILE* file_pointer; //ファイルポインタ 9 int format; //表示フォーマット 10 int chinese_characters; //漢字表示 11 int blockNumber; //現在のブロック番号 12 unsigned char errorField[40]; //エラー表示フィールド 13} DumpData; 14 15//↑構造体です。 16void file_display_one(DumpData* pointer) 17{ 18 unsigned char key; 19 int output;//出力桁数 20 int hex = 0;//16進数カウンタ 21 int asc = 0;//文字カウンタ 22 int line_number;//行番号 23 short character_flag = 0;//文字フラグ 24 25 printf(" Addr Hex ASCII\n"); 26 27 //選択したブロックサイズ÷16した数が行番号より大きい間繰り返し 28 line_number = 0; 29 while ((pointer->blockSize / DISPLAY_MAX_ONE) > line_number) 30 { 31 //行番号の表示 32 printf(" %05X ", line_number); 33 34 //16個出力するまでループ 35 for (output = 0; DISPLAY_MAX_ONE > output; output++) 36 { 37 //freadの戻り値が出力数より大きいとき 38 if (pointer->contents > hex) 39 { 40 //8個目と9個目の間に"-"表示 41 if (output == 7) 42 { 43 printf("%02X-", pointer->data[hex]); 44 } 45 else 46 { 47 printf("%02X ", pointer->data[hex]); 48 } 49 50 hex++; 51 } 52 else 53 { 54 printf(" "); 55 } 56 } 57 58 //16文字出力するまでループ 59 for (output = 0; DISPLAY_MAX_ONE > output; output++) 60 { 61 //freadの戻り値が出力数より大きいとき 62 if (pointer->contents > asc) 63 { 64 key = pointer->data[asc]; 65 66 //漢字表示ONの時(SHIFT-JIS) 67 if (pointer->chinese_characters == 1) 68 { 69 //全角文字の1byte目の時 70 if ((key >= 0x81 && key <= 0x9f) || (key >= 0xe0 && key <= 0xfc)) 71 { 72 //出力文字数が16の時 73 if (output == 15) 74 { 75 putchar('$'); 76 character_flag = RET_OK;//文字フラグを1にする 77 } 78 else 79 { 80 putchar(key); 81 } 82 } 83 else 84 { 85 //文字フラグが1の時 86 if (character_flag == RET_OK) 87 { 88 putchar('$'); 89 character_flag = 0;//文字フラグを0にする 90 } 91 //半角文字の時 92 else if ((key >= 0x20) && (key <= 0x7e)) 93 { 94 putchar(key); 95 } 96 //全角文字、半角文字でもない場合 97 else 98 { 99 putchar('$'); 100 } 101 } 102 } 103 //漢字表示OFFの時(ASCII) 104 else 105 { 106 //半角文字の時 107 if ((key >= 0x20) && (key <= 0x7e)) 108 { 109 putchar(key); 110 } 111 else 112 { 113 putchar('$'); 114 } 115 } 116 117 asc++; 118 } 119 else 120 { 121 putchar(' '); 122 } 123 } 124 125 line_number++;//行番号のカウントアップ 126 printf("\n"); 127 128 //4行出力ごとに改行 129 if ((line_number % 4) == 0) 130 { 131 printf("\n"); 132 } 133 } 134}
###試したこと
ファイルの内容を配列に格納して配列の先頭から1バイトずつ判断しようとしてみました。あと、printfの%sも試したのですがプログラムが終了しちゃいます。
###補足情報(言語/FW/ツール等のバージョンなど)
サクラエディタ、SDKコマンドプロンプトで開発しています。
回答2件
あなたの回答
tips
プレビュー