2017-11-13 4 views
0

C# 클라이언트와 C++ 서버가 있습니다. 나는 소켓을 통해 사용자의 페이스 북 이름을 보내고있다. 처음에는 이름의 길이를 씁니다. 예 : 05/*sizeofname*/ getbytes("asdfg") 오류 메시지가 표시되지 않습니다. 하지만 이렇게하려고하면 İ에 2 바이트가 있기 때문에 05/*size of name*/ getbytes("İasdf")İasd 으로 읽습니다. 하지만 다른 문자는 1 바이트입니다. C++ 서버에서 올바르게 읽는 법을 모릅니다.C# 클라이언트 및 C++ 서버의 유니 코드 데이터 소켓

서버 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

이 "나는"2 바이트를 가지고 있으며, 다른 사람들이 당신이 가장 가능성이 UTF8 인코딩을 사용하여 문자열 값을 암호화하고, 하나가 있습니다.

정확히 무슨 일이 일어나고 있는지 알기 위해 C++/C# 코드를 충분히 공유하지 않습니다. C면에서는 strlen을 사용하여 문자열의 크기를 얻을 수 있습니다.

C# 쪽에서는 Encoding.UTF8.GetByteCountEncoding.UTF8.GetBytes을 사용하여 문자열에서 바이트 배열로 변환하고 Encoding.UTF8.GetString을 사용하여 바이트 배열에서 문자열로 변환 할 수 있습니다.

+0

내 코드를 추가했습니다. 나는 C++의 배열에서 문자열을 읽으려고하면 "İ"문자가 c3 04와 같은 2 바이트를 가지지 만, 예를 들어 "V"는 영어 문자가 56이므로 IDK를 읽는 방법 때문에 내가 어떻게 할 수 있는지 모른다. –