2016-08-05 9 views
1

Я пытаюсь сделать приложение на C#, которое считывает активность порта IAX2 4569. Я уже создал UDP-и TCP-прослушиватели, но когда я пытаюсь преобразовать UDP data в строку Я нашел некоторые странные коды. Я не знаю, правильно ли я это делаю. Некоторая помощь в этом мне нужна. Этот класс является UDPHeader, из которого я получаю данные.Как конвертировать UDP-заголовок порта IAX2 в читаемую строку

public class UDPHeader 
{ 
    //UDP header fields 
    private ushort usSourcePort;   //Sixteen bits for the source port number   
    private ushort usDestinationPort;  //Sixteen bits for the destination port number 
    private ushort usLength;    //Length of the UDP header 
    private short sChecksum;    //Sixteen bits for the checksum 
              //(checksum can be negative so taken as short)    
    //End UDP header fields 

    private byte[] byUDPData = new byte[4096]; //Data carried by the UDP packet 

    public UDPHeader(byte [] byBuffer, int nReceived) 
    { 
     MemoryStream memoryStream = new MemoryStream(byBuffer, 0, nReceived); 
     BinaryReader binaryReader = new BinaryReader(memoryStream); 

     //The first sixteen bits contain the source port 
     usSourcePort = (ushort)IPAddress.NetworkToHostOrder(binaryReader.ReadInt16()); 

     //The next sixteen bits contain the destination port 
     usDestinationPort = (ushort)IPAddress.NetworkToHostOrder(binaryReader.ReadInt16()); 

     //The next sixteen bits contain the length of the UDP packet 
     usLength = (ushort)IPAddress.NetworkToHostOrder(binaryReader.ReadInt16()); 

     //The next sixteen bits contain the checksum 
     sChecksum = IPAddress.NetworkToHostOrder(binaryReader.ReadInt16());    

     //Copy the data carried by the UDP packet into the data buffer 
     Array.Copy(byBuffer, 
        8,    //The UDP header is of 8 bytes so we start copying after it 
        byUDPData, 
        0, 
        nReceived - 8); 
    }} 

Следующий У меня есть класс для преобразования данных из UDPHeader в обычный текст. Это конструктор:

public IAXHeader(byte[] byBuffer, int nReceived) 
{ 
MemoryStream memoryStream = new MemoryStream(byBuffer, 0, nReceived); 
StringReader stringReader = new StringReader(Encoding.UTF8.GetString(memoryStream.ToArray())); 

/** iterate lines of stringReader **/ 
string aLine = stringReader.ReadLine(); 
} 

Console.WriteLine из Алине это: Console log for aLine of stringReader

Мне нужно знать, что я делаю неправильно, чтобы декодировать байты из IAX2 UDP данных.

ответ

1

Поскольку этот протокол не является текстовым читаемым протоколом, просто проанализируйте его как строку UTF8, вы получите неожиданные результаты.

Вы должны прочитать описание протокола (например, [https://tools.ietf.org/html/rfc5456]) и проанализировать данные на основе этого описания.

Для начала вы можете напечатать байт данных байтом в виде шестнадцатеричных кодов.

+0

Спасибо, я прочитал протокол и изменил код. Данные заголовка IAX2 шифруются и в двоичном формате. Я все еще работаю над шифрованием, но у меня есть некоторые данные, которые мне нужны. Еще раз спасибо. – Lichblitz

 Смежные вопросы

  • Нет связанных вопросов^_^