добавить переменную в шестнадцатеричный поток - PullRequest
0 голосов
/ 16 декабря 2018

в c # я хочу добавить переменную из trackbar.value в шестнадцатеричный поток:

            UdpClient udpClient = new UdpClient("192.168.1.205", 52381);=
        Byte[] sendBytes = new byte[] { 
            0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xff, 0x81, 0x01, 
            0x04, 0x07, 0x0("trackbar.value"), 0xFF 
        };

        try
        {
            udpClient.Send(sendBytes, sendBytes.Length);
        }
        catch (Exception)
        {
            Console.WriteLine(e.ToString());
        }

как мне синтаксис, что?

1 Ответ

0 голосов
/ 16 декабря 2018

Если у вас есть массив байтов фиксированного размера, вы можете сделать это:

Byte[] sendBytes = new byte[] { 
    0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xff, 0x81, 0x01, 
    0x04, 0x07, 0x00, 0xFF 
    };

sendBytes[12] = (byte) trackbar.value;

НО: Это, конечно, приведет к потере данных, если ваш trackbar.value не является байтомзначение и превышает максимальное значение 255. Таким образом, вам придется либо снизить точность и масштабировать свое значение, например:

byte scaledValue = (byte) ((double) trackbar.value / [maximum_trackbar_value] * 255.0);

, либо увеличить количество байтов, используемых в вашем сообщении для передачи значения.
Например, для использования 16-битного целого числа с максимальным значением 65535 (= 2 ^ 16 - 1) потребуется 2 байта.Чтобы «разделить» ваше значение на эти 2 байта, вам нужно сделать битовый сдвиг, подобный этому

1. sendBytes[12] = (byte) trackbar.value;
2. sendBytes[13] = (byte) (trackbar.value >> 8);

Вторая строка сместит 8 старших битов значения вправо, чтобы их можно было поместить вследующий байт, который можно использовать только для 8 бит, остальные будут обрезаны.Для лучшего понимания:

1. (byte) (00000101 00111001) = 00111001
2. (byte) ((00000101 00111001) >> 8) = (byte) (00000000 00000101) = 00000101

Это передаст ваше значение в порядке с прямым порядком байтов, то есть младший байт («меньшее значение») будет первым в вашем массиве.Вы найдете более подробную информацию по этой теме здесь: https://en.wikipedia.org/wiki/Endianness. Получатель вашего сообщения должен будет сделать обратное:

int trackbarValue = (receivedBytes[12] & 0xFF) | ((receivedBytes[13] & 0xFF) << 8);

Вот две функции, чтобы сделать это немного более общим:

public static byte[] GetBytesLittleEndian(int num, int byteCount)
{
    var result = new byte[byteCount];

    for (int i = 0; i < byteCount; i++)
    {
        result[i] = (byte)(num >> (i * 8));
    }

    return result;
}

public static int ParseLittleEndian(byte[] data, int byteCount)
{
    int parsed = 0;

    for (int i = 0; i < byteCount; i++)
    {
        parsed |= data[i] << (i * 8);
    }

    return parsed;
}

Конечно, для этого есть встроенная функциональность, см., Например, BitConverter.GetBytes (), но я думаю, что некоторые детали не помешают;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...