BCD出力について – プログラミング – Home

通知
すべてクリア

[解決済] BCD出力について


たれさん
 たれさん
(@たれさん)
ゲスト
結合: 15年前
投稿: 7
Topic starter  

お世話になります。
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

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


引用未解決
トピックタグ
れんこん
 れんこん
(@れんこん)
ゲスト
結合: 15年前
投稿: 2
 

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 );
これ間違ってませんか?


返信引用
たれさん
 たれさん
(@たれさん)
ゲスト
結合: 15年前
投稿: 7
Topic starter  

れんこんさん、早速のお返事ありがとうございます。

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

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


返信引用
れんこん
 れんこん
(@れんこん)
ゲスト
結合: 15年前
投稿: 2
 

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'を使う人もいます。


返信引用
たれさん
 たれさん
(@たれさん)
ゲスト
結合: 15年前
投稿: 7
Topic starter  

解説ありがとうございました。
非常にわかりやすかったです!助かりました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました