BCD出力について

[戻る]
たれさん 2009/11/09(月) 13:07:21
お世話になります。
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

のように表示させたいのですが、どなたかお教えください。
宜しくお願いします。

れんこん 2009/11/09(月) 13:33:27
    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 );
これ間違ってませんか?

たれさん 2009/11/09(月) 13:51:24
[[解決]]
れんこんさん、早速のお返事ありがとうございます。

data = atoi( str );  //←逆でしたね(汗)すいません。

おかげ様で一発解決しました。
あと、お手数ですが、簡単に解説をお願いしてもよろしいでしょうか?

れんこん 2009/11/09(月) 14:13:57
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'を使う人もいます。

たれさん 2009/11/09(月) 17:00:17
解説ありがとうございました。
非常にわかりやすかったです!助かりました。

古いスレッドには追加発言できません。