バイナリをテキストファイルに書き込みたい
<プログラム環境>
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);
宜しければ、ご指摘の程よろしくお願いします。
お礼
itohoo様、有難うございます。 原因は分かりませんが、他のソースをいじっている内に直りました。 有難うございました。