重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

VC++6.0,MFC,ダイアログベースでバイナリデータ受信とファイル書き込みのプログラムを作っています。
COMポートからバイナリを10バイト受信し、受信した内容を1.txtに書き込み、1.txtを開いて、受信した内容を確認したいです。

以下のソースで実行すると、1.txtにはFフフフフフフフフフと書かれていました。これを16進数で表示させたり、10進数で表示させるにはどうしたらいいでしょうか?

/////////データ受信//////////////
unsigned char rdBuf[10];
unsigned char* prdBuf;
DWORD dwCount;
DWORD dwRead;

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

if(ReadFile(hCom,prdBuf,dwCount,&dwRead,&old) == 0){
if(ERROR_IO_PENDING == GetLastError()){
if(WaitForSingleObject(hEvent,INFINITE) == WAIT_OBJECT_0){
if(GetOverlappedResult(hCom,&old,&dwCount,TRUE)){
//"データ受信完了"
}}}
else //エラー
}

/////////ファイルに書き込む//////////////
HANDLE hFile;
hFile = CreateFile(
".\\ScanData\\1.txt",
GENERIC_WRITE,
0,
NULL,
OPEN_ALWAYS,
FILE_FLAG_OVERLAPPED,
NULL
);

if(WriteFile( hFile, rdBuf,10, &wbyte, &old ) == 0){
if(ERROR_IO_PENDING == GetLastError()){
if(WaitForSingleObject(hEvent,INFINITE)==WAIT_OBJECT_0){
if(GetOverlappedResult(hCom,&old,&wbyte,TRUE)){
//書き込み完了
}}}
else //書き込み失敗
}

A 回答 (4件)

>「0x12f45c 0」と書き込まれました。


rdBufの配列の先頭アドレスでしょう。
後ろに付いている"0"はファイルに最初から書かれていたものでしょう。

>「0x06 45c 0」が書き込まれました。
>"45c 0"が何故書き込まれたのか分りません・・。
直前に書かれていた「0x12f45c 0」の残りでしょう。

>「0x06 0x020」が書き込まれました。
>最後の"0"が何故書き込まれたのか分りません・・。
直前に書かれていた「0x06 45c 0」の残りでしょう。

「ファイルを書き込みモードでオープン」して「上書き」しているのですから、
直前の実行時に書き出されたデータがそのままなのは当然かと思われます。
CreateFile()の引数を調べてみれば判るかと思いますが。
    • good
    • 0
この回答へのお礼

有難うございました。
CREATE_ALWAYSと指定して問題は解決しました。

お礼日時:2008/05/19 18:13

>if(ReadFile(hCom,prdBuf,dwCount,&dwRead,&old) == 0){


で読み込んだ時のサイズを使わずに、
>if(WriteFile( hFile, rdBuf,10, &wbyte, &old ) == 0){
で強制的に10バイト書き込んでいるようですが。

VCのデバッグモードでビルドすると、未初期化のローカル変数は0xccで埋められます。
それが書き出されたのが「フフフフフフ」(本来は半角で見えます)てかと。

バイナリエディタで見るのが妥当だと思われますが……

文字列化してテキストで見たいというのであれば、wsprintf()等で、"%02x"で文字列化して書き込んでください。
# "%02x"で1バイトのデータを表すのに2バイト(と'\0'分の+1バイト)が必要になります。

この回答への補足

有難うございます!
受信されたデータをMessageBox()を使って16進数で表示すると
06 02 80 9a 00 b1 56 30 32 2e
なのですが。

教えた頂いた通りか分かりませんが、自分なりにwsprintf()を使ってみました。以下のようにして1.txtに書き込むと、
「0x12f45c 0」と書き込まれました。
charwBuf[256];
wsprintf(wBuf,"%#02x ",rdBuf);
WriteFile( hFile, wBuf,(DWORD)strlen(wBuf), &wbyte, &old );

2行目をwsprintf(wBuf,"%#02x ",rdBuf[0]);にすると
「0x06 45c 0」が書き込まれました。
"45c 0"が何故書き込まれたのか分りません・・。

同様にwsprintf(wBuf,"%#02x %#02x",rdBuf[0],rdBuf[1]);にすると
「0x06 0x020」が書き込まれました。
最後の"0"が何故書き込まれたのか分りません・・。

今後rdBufに可変長でバイナリを読み込み、それを書き込みたいので、バイナリデータの長さを数えたりして、その長さ分だけ書き込むようにしたいです。

どのようにしたら実現できるが、アドバイス頂けましたら幸いです。
返答お待ちしております^^
よろしくお願いします。

補足日時:2008/05/15 11:35
    • good
    • 0

一番手っ取り早いのはバイナリエディタをインストールしてそれを使ってファイルを確認すること。



どうしてもプログラムでファイルに書き出したいというなら、sprintf()などで文字列に16進なり10進なりで書き込んで、その文字列をファイルに書き出す。
    • good
    • 0

編集するならwsprintfが普通かな。



参考URL:http://msdn.microsoft.com/ja-jp/library/cc364872 …
    • good
    • 0

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