お世話になります。
VC++6.0ダイアログベースで開発中ですが、質問があります。
リストボックス内の2桁数字のテキストを取得しBCDでバイナリ出力したいのです
が、やり方がよくわかりません。
リストボックス内に例えば以下のようなデータがあります。
12
23
34
現在以下のように記述してます。
ofstream fout;
int i, num, data;
CString str;
unsigned char DATA[2];
fout.open( test.dat, ios::out | ios::binary );
num = m_listbox.GetCount(); //リストボックス内のデータ数取得
for( i = 0; i < num; i++ ){
m_listbox.GetText( str ); //リストボックス内のテキスト取得
str = atoi( data ); //イント型に変換
DATA[1] = ( data > 8 ) & 0xff;
DATA[0] = data & 0xff;
fout.write( data, 1 );
}
fout.close();
が、出力したファイルをバイナリエディタで開くと
0C 17 22
のように表示されます。これを
12 23 34
のように表示させたいのですが、どなたかお教えください。
宜しくお願いします。
ofstream fout;
unsigned char DATA;
CString str=12;
fout.open( test.dat, ios::out | ios::binary );
DATA = ((str.GetAt(0) - 0x30) << 4) + (str.GetAt(1) - 0x30);
fout.write( &DATA, 1 );
fout.close();
こんな感じでしょうか? 文字列で処理
>str = atoi( data );
これ間違ってませんか?
れんこんさん、早速のお返事ありがとうございます。
data = atoi( str ); //←逆でしたね(汗)すいません。
おかげ様で一発解決しました。
あと、お手数ですが、簡単に解説をお願いしてもよろしいでしょうか?
str.GetAt(0) -> str 12の1文字目'1'を取得
- 0x30 -> '1'の文字コード0x31から0x30を引いて数値1を取得 -> 0x01
<< 4 -> 4ビットシフトして上位ビットに移動 0x01 -> 0x10
str.GetAt(1) -> str 12の2文字目'2'を取得
- 0x30 -> '2'の文字コード0x32から0x30を引いて数値2を取得 -> 0x02
0x10 + 0x02 -> 0x12
0x30の代わりに '0'を使う人もいます。
解説ありがとうございました。
非常にわかりやすかったです!助かりました。