2010-01-16 62 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

只适用于文件。但是,谢谢! – 2010-01-17 07:16:04

相关问题