
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 //書き込み失敗
}
No.4ベストアンサー
- 回答日時:
>「0x12f45c 0」と書き込まれました。
rdBufの配列の先頭アドレスでしょう。
後ろに付いている"0"はファイルに最初から書かれていたものでしょう。
>「0x06 45c 0」が書き込まれました。
>"45c 0"が何故書き込まれたのか分りません・・。
直前に書かれていた「0x12f45c 0」の残りでしょう。
>「0x06 0x020」が書き込まれました。
>最後の"0"が何故書き込まれたのか分りません・・。
直前に書かれていた「0x06 45c 0」の残りでしょう。
「ファイルを書き込みモードでオープン」して「上書き」しているのですから、
直前の実行時に書き出されたデータがそのままなのは当然かと思われます。
CreateFile()の引数を調べてみれば判るかと思いますが。
No.3
- 回答日時:
>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に可変長でバイナリを読み込み、それを書き込みたいので、バイナリデータの長さを数えたりして、その長さ分だけ書き込むようにしたいです。
どのようにしたら実現できるが、アドバイス頂けましたら幸いです。
返答お待ちしております^^
よろしくお願いします。
No.2
- 回答日時:
一番手っ取り早いのはバイナリエディタをインストールしてそれを使ってファイルを確認すること。
どうしてもプログラムでファイルに書き出したいというなら、sprintf()などで文字列に16進なり10進なりで書き込んで、その文字列をファイルに書き出す。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッファとは何ですか
-
Microsoft VBAで2GBを超えるフ...
-
入力ファイルをバイナリにする利点
-
バイナリ形式のXMLファイルを読...
-
ページ読み込み時に自動的にsub...
-
バッファサイズについて
-
FTP転送
-
プログラミング初心者です。プ...
-
バイナリって
-
EXCEL VBAでテキストファイルの...
-
ビットマップファイル生成(C言...
-
バイナリーデータの一部データ...
-
C言語初心者の質問失礼します。
-
Wordファイルの結合
-
ファイル形式またはファイル拡...
-
SGファイルって何ですか?
-
フルパスから最後のディレクト...
-
シェルコマンドの 2>&1 とはど...
-
FTPでputすると空ファイルが出...
-
営業秘密の漏洩について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッファとは何ですか
-
Microsoft VBAで2GBを超えるフ...
-
VBA バイナリ―から文字列にす...
-
エラー:ストリームの終わりを...
-
EOF
-
EXCEL VBAでテキストファイルの...
-
C言語の質問です。バイナリ形...
-
MacからWinにファイルを添付す...
-
エクセルVBA 2千万行のCSVファ...
-
Javaでのエンディアン変換
-
入力ファイルをバイナリにする利点
-
テキストデータをSQLServerに取...
-
【MFC】CFileでSeekした位置か...
-
【python】Excelファイルを読み...
-
fscanf? 外部ファイル(時刻表...
-
C言語とシリアル通信の送受信...
-
ページ読み込み時に自動的にsub...
-
【Teraterm】filewritelnについて
-
C言語でBMPファイルの内容を表...
-
コンピュータ系にはめっぽう弱...
おすすめ情報