- ベストアンサー
0バイト文字の送信
C#ですが、C/C++でも同じだと思うので、 お願いします。 たとえば、"abcde"という文字を、終端文字0バイト として、送信したいのですが、どうしたらいいので しょうか。 string mys="abcde"; byte[] mybyte=new byte[1024]; mybyte=Encoding.UNICODE.GetBytes(mys); mynetwork.Write(mybyte,0,mybyte.Length); こんな感じで、書き出すつもりですが、終端が、 0バイトには、なっていないようです。 (ちなみに、JAVAだと、文字列を、送るので "abcde\0"で、うまくいきます。バイト配列で 送る場合が、わかりません。 分かる人がいましたら、お願いします
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>justitia C#ですが、C/C++でも同じだと思うので、 同じではありません。 Cの場合、基本的にはRecvとSendなので、 文字列というかバイトストリームを送っているわけですが、 普通パケットにはパケットの種類とデータ長をヘッダ等につけるため、 データ長が0なら空文字だと判定できます。 このソースの場合パケットの中にデータ長を含めてないのが問題なのです。 単にNULL文字を終端に加えたいなら string mys="abcde"; byte[] mybyte; mybyte=Encoding.Unicode.GetBytes(mys); byte[] mybyte2 = new byte[mybyte.Length+2]; mybyte.CopyTo( mybyte2 , 0 ) ; mybyte2[mybyte2.Length -1] = 0; //NULL文字(2バイト)を終端にいれる mybyte2[mybyte2.Length -2] = 0; mynetwork.Write(mybyte2,0,mybyte2.Length); といった感じでしょうか。 あとbyte[] mybyte2 = new byte[1024]; としていますが、この1024は意味がありません。 Encoding.Unicode.GetBytes(mys);によって あらたに配列が確保しなおされてしまいます。
その他の回答 (1)
- nitscape
- ベストアンサー率30% (275/909)
>mynetwork.Write(mybyte,0,mybyte.Length); mybyte.Lengthだからではないでしょうか?myByteというオブジェクトがどのように動いているのか分かりませんが1024が返るということはないですか? 「終端文字0バイトとして送信」という質問の意味がいまいちわからなかったのでVC++での方法を何通りかを。。。(いちいちmemcpyでBYTEにしなくてもいいのですが無駄に変換を入れています) ・"abc"をNULLを含めた4バイトとして送信したい char pszBuff[10]; strcpy(pszBuff,"abc"); BYTE pbBuff[10]; memcpy(pbBuff,pszBuff,strlen(pszBuff)+1); pbBuffからstrlen(pszBuff)+1バイト送信 ・"abc"をNULLを含めない3バイトとして送信したい char pszBuff[10]; strcpy(pszBuff,"abc"); BYTE pbBuff[10]; memcpy(pbBuff,pszBuff,strlen(pszBuff)); pbBuffからstrlen(pszBuff)バイト送信 ・"abc"をUNICODEとしてNULLを含めて送信したい char pszBuff[10]; strcpy(pszBuff,"abc"); BYTE pbBuff[10]; CAtlStringW ustrUnicode=pszBuff; //UNICODEに変換 memcpy(pbBuff,(LPCWSTR)ustrUnicode,ustrUnicode.GetLength()*2+2); pbBuffから文字数*2+2バイト送信(Unicodeは1文字2バイトなので*2) ・"abc"をUNICODEとしてNULLを含めずに送信したい char pszBuff[10]; strcpy(pszBuff,"abc"); BYTE pbBuff[10]; CAtlStringW ustrUnicode=pszBuff; //UNICODEに変換 memcpy(pbBuff,(LPCWSTR)ustrUnicode,ustrUnicode.GetLength()*2); pbBuffから文字数*2バイト送信(Unicodeは1文字2バイトなので*2)
お礼
回答ありがとうございます。 No.1の回答でがんばったら、うまくいきました。 C++とは、構文が少し違いますが、考え方が、 同じなので、参考になりました。
お礼
回答ありがとうございます。 うまくいきました。 後、"abcde\0"を、バイト配列にエンコード してもみましたが、これでもうまくいきました。