Сравнивая байты с шестнадцатеричным? - PullRequest
0 голосов
/ 31 июля 2011

Мне нужно сравнить первые 5 байтов пакета UDP с двумя определениями и действовать соответственно с ними, если он соответствует одному. Тем не менее, как я должен представлять Hex для этого, поскольку это, очевидно, не будет / не работает?

Комментированные строки - оригинальный способ, которым я это делал, но не очень эффективный.

private static void HandleQuery(Socket socket, EndPoint Remote)
{
    byte[] A2S_INFO_REQUEST = StringToByteArray("\xFF\xFF\xFF\xFF\x54");
    byte[] A2S_PLAYER = StringToByteArray("\xFF\xFF\xFF\xFF\x55");

    byte[] data = new byte[1400];
    int recv = socket.ReceiveFrom(data, ref Remote);

    // A2S_INFO QUERY
    //if (recv == 25 && data[4] == 84)
    if (CompareByteArray(A2S_INFO_REQUEST, data, 5))
    {
        ReplyInfoQuery(socket, Remote);
    }

    // A2S_PLAYER QUERY
    //if (recv == 9)
    if (CompareByteArray(A2S_PLAYER, data, 5))
    {
        ReplyPlayerQuery(socket, Remote);
    }
}

private static byte[] StringToByteArray(String hex)
{
    int NumberChars = hex.Length;
    byte[] bytes = new byte[NumberChars / 2];
    for (int i = 0; i < NumberChars; i += 2)
    bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
    return bytes;
}

private static bool CompareByteArray(byte[] a1, byte[] a2, int len)
{
    for (int i = 0; i < len; i++)
    {
        if (a1[i] != a2[i])
        {
            return false;
        }
    }

    return true;
}

Ответы [ 2 ]

2 голосов
/ 31 июля 2011

Вы можете заполнить байтовый массив проще:

//byte[] A2S_PLAYER = StringToByteArray("\xFF\xFF\xFF\xFF\x55");
byte[] A2S_PLAYER = new byte[] {0xFF, 0xFF, 0xFF, 0xFF, 0x55} ;
0 голосов
/ 31 июля 2011

Я бы предложил преобразовать ваши 5 байтов в длину (System.Int64).Таким образом, вы даже можете использовать переключатель / кейс для отправки ваших запросов.

...