2017-11-13 1 views
0

私はC#クライアントとC++サーバーを持っています。私はソケットを介してユーザーのFacebookの名前を送信しています。私は最初に名前の長さを書きます。例: 05/*sizeofname*/ getbytes("asdfg") 私はエラーが発生しません。しかし、私がこれをやろうとすると、İは2バイトを持っているので、 05/*size of name*/ getbytes("İasdf")は、İasd しか読み込みません。しかし、他の文字は1バイトです。私はそれをC++サーバで正しく読む方法を知らない。C#クライアントとC++サーバーのUnicodeデータソケット

サーバーC++:

byte firstlen = packet.byteread(); 
       if (firstlen >= 150 || firstlen <= 0) { printf("first %d came\n", firstlen); goto hataver; } 
       char * firstname = new char[firstlen]; 
       firstname = (char*)packet.charread(firstlen); 
       printf("income firstname = %s\n", firstname); 

char * charread(int idlen) 
{ 
    char * retarray = new char[idlen]; 
    memcpy(retarray, buffs + marker, idlen); 
    marker += idlen; 
    retarray[idlen] = 0; 
    return retarray; 
} 

クライアントのC#

yenisi.eklestrlen(firstname, (byte)sizeof(profile.FirstName)); //(byte)firstname.Length); 

    public void eklestrlen(string eklenecek,byte uzunluk) 
    { 
     ekle1(uzunluk); 
     ekles(eklenecek); 
    } 

    public void ekle1(byte eklenecek) 
    { 
     Paket2[marker] = eklenecek; 
     marker++;// eklenecek.Length; 
    } 

    public void ekles(string eklenecek2) 
    { 
     byte[] eklenecek = Encoding.UTF8.GetBytes(eklenecek2); 
     Array.Copy(eklenecek, 0, Paket2, marker, eklenecek.Length); 
     marker += eklenecek.Length; 

    } 
+0

[最小、完全、および検証可能な例](https://stackoverflow.com/help/mcve)を提供(投稿)できますか? –

答えて

1

もし "i" は2つのバイトを持っており、他の人があなたが最も可能性が高いUTF8エンコーディングを使用して文字列値を符号化している、1つを持っています。

正確に何が起こっているのかを知るには、C++/C#のコードを十分に共有していません。 C側では、strlenを使用して文字列のサイズを取得できるはずです。

C#側では、Encoding.UTF8.GetByteCountEncoding.UTF8.GetBytesを文字列からバイト配列に変換し、Encoding.UTF8.GetStringを使用してバイト配列を文字列に変換できます。

+0

私のコードを追加しました。私はC++の配列から文字列を読み込もうとすると "İ"という文字がc3 04のように2バイトであるが、 "V"のような英字は56だからIDKの読み方が違うので、どうすればいいのか分からない。 –

関連する問題