プロが教えるわが家の防犯対策術!

<プログラム環境>
Windows XP,VC++6.0,MFC AppWizard(exe),ダイアログベース

<目的>
COMポートから受信した可変長バイナリデータを1.txtに書き込む。
※バイナリエディタを使用せずに16進数で読めるように書く

<質問>
受信したバイナリデータは「02 80 9a 00 b1 56」なのですが、これをテキストファイルに16進数で書き込むことができません。
どのようにしたら良いでしょうか?

今は以下のソースです。
コメントアウト部分はMessageBox等で表示する処理をしています。
先頭1バイト受信→"06"を受信したのでさらに6バイト受信→6バイト書き込む。という順序です。
以下で実行するとファイルには「 00000」と書き込まれました。何なのか全く分かりません・・。
//////////先頭の1バイトだけ受信する/////////////////////////////////////////
DWORD bLError;
unsigned char ucLen;
DWORD dwCount = 1;
DWORD dwRead;

if(ReadFile(hCom,&ucLen,dwCount,&dwRead,&old) == 0){
if(ERROR_IO_PENDING == GetLastError()){
bLError = WaitForSingleObject(hEvent,100);
if(bLError == WAIT_OBJECT_0){
if(GetOverlappedResult(hCom,&old,&dwCount,TRUE));//データ受信完了
}
else if(bLError == WAIT_FAILED);//受信スリープエラー
else if(bLError == WAIT_TIMEOUT);//受信タイムアウト
}
else ;//受信エラー
}

//////////先頭データの情報から可変長で読み込む//////////////////////////////
unsigned char rdBuf[256];
unsigned char* prdBuf;

prdBuf = &rdBuf[0];
dwCount = ucLen;

if(ReadFile(hCom,prdBuf,dwCount,&dwRead,&old) == 0){
if(ERROR_IO_PENDING == GetLastError()){
bLError = WaitForSingleObject(hEvent,100);
if(bLError == WAIT_OBJECT_0){
if(GetOverlappedResult(hCom,&old,&dwCount,TRUE))));//データ受信完了
}
else if(bLError == WAIT_FAILED);//受信スリープエラー
else if(bLError == WAIT_TIMEOUT);//受信タイムアウト
}
else ;//受信エラー
}
//////////データ書き込み/////////////////////////////////////////////////////
HANDLE hFile;
hFile = CreateFile( ".\\ScanData\\1.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_OVERLAPPED,NULL );
char Buf[256];
char wBuf[256] = "";

wsprintf(Buf,"%#02x",rdBuf);
for(BYTE i=1;i<dwRead;i++){
wsprintf(Buf,"%#02x ",rdBuf[i]);
wBuf[i] = Buf[0];
}
if(WriteFile( hFile, wBuf,dwRead, &wbyte, &old ) == 0){
if(ERROR_IO_PENDING == GetLastError()){
if(WaitForSingleObject(hEvent,1000)==WAIT_OBJECT_0){
if(GetOverlappedResult(hCom,&old,&wbyte,TRUE)){//データ書き込み完了
}}}
else ;//データ書き込みエラー
}

//////////受信したデータ10バイト分をMessageBoxで表示//////////////////////
wsprintf(Buf,"文字 = %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",rdBuf[0],rdBuf[1],rdBuf[2],rdBuf[3],rdBuf[4],rdBuf[5],rdBuf[6],rdBuf[7],rdBuf[8],rdBuf[9]);
MessageBox(Buf);
宜しければ、ご指摘の程よろしくお願いします。

A 回答 (2件)

マルチエントリですね。


>char wBuf[256] = "";
>for(BYTE i=1;i<dwRead;i++){
>wsprintf(Buf,"%#02x ",rdBuf[i]);
>wBuf[i] = Buf[0];
こういうコーディングを見ると、何か高級言語的な感覚が抜けてませんね。
以前のスレッドで、示したやり方を見ましたか?

unsigned char rBuf[256]; //受信バッファ
char wBuf[256]; //出力バッファ
char *wp; //出力バッファのポインタ
wp = wBuf; //出力先を出力バッファの先頭に合わせる
for( int i = 0 ; i < dwRead ; i++ ) {
  wp += wsprintf(wp,"%#02x",rBuf[i]);
}
上記のwp += wsprintf(wp,"%#02x",rBuf[i]);の説明
1回目:wp(wBufの先頭)にrBuf[0]の内容を編集して格納する。
     wsprintfの戻り値は編集結果のバイト数なので、ここでは4です。
     この戻り値をwpに加えるので、wpはwBuf[4]を指すようになります。
2回目:wp(wBuf[4]の所)にrBuf[1]の内容を編集して格納する。
     戻り値(4)をwpに加えるので、wpはwBuf[8]を指すようになります。
3回目:wp(wBuf[8]の所)にrBuf[2]の内容を編集して格納する。
     戻り値(4)をwpに加えるので、wpはwBuf[12]を指すようになります。
以下同様です。C言語ですから、文字列を編集するにも、出来上がりのバイト数、
次の文字列の格納位置など、自力で管理しなければなりません。
    • good
    • 0
この回答へのお礼

nda23様
非常に分かりやすくご説明して頂きありがとうございました。
ポインタにwsprintfを足す意味がやっと分かりました。
ソースを以下にして、うまく書き込むことができました。

unsigned char rdBuf[256]; //受信バッファ
charwBuf[256];//出力バッファ
char*pwBuf;//出力バッファのポインタ
BYTEwb=0;//出力バイト数
pwBuf = wBuf;//出力先を出力バッファの先頭に合わせる
for(BYTE i=0;i<dwRead;i++){
pwBuf += wsprintf(pwBuf,"%02x ",rdBuf[i]);
wb += wsprintf(pwBuf,"%02x ",rdBuf[i]);
}
WriteFile( hFile, wBuf,wb, &wbyte, &old );

お礼日時:2008/05/20 16:26

「データ書き込み」のところの for 文が変です.


wsprintf で %#02x を使ってますから, Buf には "0x??" という形式で入ります. で rdBuf[i] = Buf[0] としてますが, このとき Buf[0] は '0' です.
つまり, wBuf は最初が '\0', そのあとは dwByte-1 個の '0' からなる文字列になります.
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!