- ベストアンサー
排他的論理和 BCC(水平パリティ《偶数》)の算出
排他的論理和 BCC(水平パリティ《偶数》)の算出 VC++6.0 MFCダイアログベースでプログラミングの勉強をしています。 RS232Cを使って、相手側の機器から送られてきた、 受信データが正しいか水平パリティチェックを行いたいと思っています。 下記のように作り、 bcc[0] ^= pszBuf; この部分で受信した データの排他的論理和の計算をしているのですが、これでは中身ではなくアドレスを 計算しているようでした・・・。 どのように直したら良いでしょうか? char Buf[32]; // 読み出しデータバッファ int i; // BCCチェックループ回数 char bcc[1] = {0}; // BCC計算結果 // 受信 ReadFile(m_hComm, // ファイルハンドル (LPCVOID*)Buf, // バッファアドレス (DWORD)dwCount, // サイズ &dwRead, // 実際のサイズを格納する変数 NULL); // OVERLAPPED構造体 // 該当範囲の排他的論理和XORを取る pszBuf++; // 最初の[STX]は計算除外なのでインクリメント for(i = 0; i < 9; i++) { // 9回計算する。 bcc[0] ^= pszBuf; pszBuf++; } 受信するデータは JIS/ASCIIコード です。 受信する形式は [STX] X X Y Y Y Y Y Y [ETX] [BCC] です。 BCCの計算は X ^ X ^ Y ^ Y ^ Y ^ Y ^ Y ^ Y ^ [ETX] = [BCC]
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
★アドバイス ・『ReadFile』関数のキャストは必要ありません。 ・『Buf』はポインタではないので『buf++』は出来ません。 ・『dwCount』には『32』がセットされていますか? ・『dwCount』と『dwRead』は DWORD 型ですよね。 ・下にサンプルを載せますので、これを参考にソースを見直して下さい。 サンプル: TCHAR bcc[ 1 ] = { 0 }; TCHAR Buf[ 32 ]; DWORD dwRead; INT i; if ( ReadFile(m_hComm,Buf,sizeof(Buf),&dwRead,NULL) ){ LPTSTR lpBuf = Buf + 1; // 最初の[STX]は計算除外なのでインクリメント for ( i = 0 ; i < 9 ; i++ ){ // 9回計算する。 bcc[ 0 ] ^= *lpBuf++; } } 最後に: ・ソースを載せるのならば省略しない方がいいでしょう。 ・以上。おわり。
その他の回答 (3)
- php504
- ベストアンサー率42% (926/2160)
LPCVOID自体がVOID*なので (LPCVOID*)Buf は (VOID**)Buf になっちゃいますよ
お礼
php504さんありがとうございます。 最初 (LPCVOID)Buf とした所、 2 番目の引数を 'char' から 'void *' に変換できません。 とエラーが出たので、安易に*を付けてしまいました。 下記コードを使うことにしました。 if ( ReadFile(m_hComm,Buf,sizeof(Buf),&dwRead,NULL) ){
- Tacosan
- ベストアンサー率23% (3656/15482)
コードを見て疑問に思ったこと: その「pszBuf」ってのは, どこでどのように定義されてるの? ReadFile で受信するときにはバッファアドレスとして Buf を使ってるんだけど, それと pszBuf とはどのような関係なの?
補足
Tacosanさん回答ありがとうございます。 せっかく読んでいただいたのに失礼なことをしてしまい申し訳ございません。 誤記です。 pszBuf = Buf バッファなんで余計なpszなくても良いかと思って削除したのですが、中途半端でした。 以下が修正版です。 char Buf[32]; // 読み出しデータバッファ int i; // BCCチェックループ回数 char bcc[1] = {0}; // BCC計算結果 // 受信 ReadFile(m_hComm, // ファイルハンドル (LPCVOID*)Buf, // バッファアドレス (DWORD)dwCount, // サイズ &dwRead, // 実際のサイズを格納する変数 NULL); // OVERLAPPED構造体 // 該当範囲の排他的論理和XORを取る Buf++; // 最初の[STX]は計算除外なのでインクリメント for(i = 0; i < 9; i++) { // 9回計算する。 bcc[0] ^= Buf; Buf++; }
- Oh-Orange
- ベストアンサー率63% (854/1345)
★『pszBuf』はポインタですよね。 ・それならば『bcc[0] ^= *pszBuf;』としないとアドレスを計算することになります。 ・『*』文字でポインタの内容を参照できます。 ・以上。おわり。
補足
Oh-さん回答ありがとうございます。 最初の段階でアドレスを計算しているのに気がついたので、 実は bcc[0] ^= *pszBuf はやってみたのですが、 error C2100: 間接指定演算子 (*) の使い方が不正です。 とエラー表示が出てしまいました。
補足
Oh-さん返事遅くなりました。 無事期待通りの結果をえることが出来ました。 本当にありがとうございました。 win32 console applicationでも試しにやってみましたが うまくいきました。 #include <stdio.h> #include <afx.h> int main() { TCHAR bcc[ 1 ] = { 0 }; TCHAR Buf[ 32 ] = "00000000000";//受信データの代わり int i; LPTSTR lpBuf = Buf + 1; // 最初の[STX]は計算除外なのでインクリメント //bcc[0] = 0^0^0^0^0^0^0^0^0 =0x30 for ( i = 0 ; i < 9 ; i++ ){ // 9回計算する。 bcc[ 0 ] ^= *lpBuf++; } printf("bcc = %x\n",bcc[0]); return 0; }