2010-01-16 3 views
1

질문 :UDP 응답 인코딩을 검색 할 수 있습니까?

나는 UDP를 통해 Quake3 마스터 서버를 쿼리하고 다음과 같은 응답을 얻습니다. 보시다시피, 내가 보낸 서버의 인코딩을 알아내는 데 어려움이있었습니다 ... 수신 인코딩을 감지하거나 설정하는 방법이 있습니까?

  baBuffer = new byte[1024*100]; // 100 kb should be enough 
     int recv = sctServerConnection.ReceiveFrom(baBuffer, ref tmpRemote); 

     Console.WriteLine("Message received from {0}:", tmpRemote.ToString()); 

     System.Text.Encoding encResponseEncoding = System.Text.Encoding.Default; // Wrong... 
     //encResponseEncoding = System.Text.Encoding.ASCII; 
     //encResponseEncoding = System.Text.Encoding.UTF8; 
     //encResponseEncoding = System.Text.Encoding.GetEncoding(437); // ANSI-DOS 
     //encResponseEncoding = System.Text.Encoding.GetEncoding(1252);// ANSI-WestEurope 
     //encResponseEncoding = System.Text.Encoding.GetEncoding(1250); // Ansi-Centraleuro 
     //encResponseEncoding = System.Text.Encoding.GetEncoding("ISO-8859-1"); 
     //encResponseEncoding = System.Text.Encoding.GetEncoding("ISO-8859-9"); 
     //encResponseEncoding = System.Text.Encoding.UTF32; 
     encResponseEncoding = System.Text.Encoding.UTF7; // Bingo ! 

답변

1

인코딩 (실제로 텍스트 인 경우)은 프로토콜에 의해 결정됩니다. 프로토콜 사양이 없지만 소스 코드가 없으면 추측해야합니다.

1

Byte Order Mark (BOM)을 찾을 수 있습니다. VB.Net 코드는 다음과 같습니다.

Private Shared Function GetStringFromBytes(ByVal bytes() As Byte) As String 
    Dim ByteLegth = bytes.Count 
    If (ByteLegth >= 3) AndAlso (bytes(0) = &HEF) AndAlso (bytes(1) = &HBB) AndAlso (bytes(2) = &HBF) Then 
     Return System.Text.Encoding.UTF8.GetString(bytes) 
    ElseIf (ByteLegth >= 2) AndAlso (bytes(0) = &HFE) AndAlso (bytes(1) = &HFF) Then 
     Return System.Text.Encoding.BigEndianUnicode.GetString(bytes) 
    ElseIf (ByteLegth >= 2) AndAlso (bytes(0) = &HFF) AndAlso (bytes(1) = &HFE) Then 
     Return System.Text.Encoding.Unicode.GetString(bytes) 
    ElseIf (ByteLegth >= 2) AndAlso (bytes(0) = &H0) AndAlso (bytes(1) = &H0) AndAlso (bytes(2) = &HFE) AndAlso (bytes(3) = &HFF) Then 
     Return New System.Text.UTF32Encoding(True, True).GetString(bytes) 
    ElseIf (ByteLegth >= 2) AndAlso (bytes(0) = &HFF) AndAlso (bytes(1) = &HFE) AndAlso (bytes(2) = &H0) AndAlso (bytes(3) = &H0) Then 
     Return System.Text.Encoding.UTF32.GetString(bytes) 
    Else 
     'No BOM, assume ASCII 
     Return System.Text.Encoding.ASCII.GetString(bytes) 
    End If 
End Function 
+0

은 파일에서만 작동합니다. 하지만 고마워! –

관련 문제