Bezdepbonusu7Программирование: статьи и ответы

Вопрос

С# помогает разделить двухбайтовое слово на байты

Автор вопроса: user842026Ответов: 3

Здравствуйте, я относительно новичок в программировании на С# и был бы признателен за помощь. Я пишу программу, которая связывается с машиной через RS232, и мне нужно отправить серию байтов для инициации связи. У меня есть двухбайтовое 16-битное CRC-слово в конце пакета, которое, я думаю, мне нужно разделить на два байта, чтобы поместиться в массив байтов.

// { <DLE> , <STX> , "G" , <DLE> , <ETX> , 16 BIT CRC CCITT split into two bytes}

byte[] byteToSend = new byte[] { 0x10, 0x02, 0x47, 0x10, 0x03, 0x421F };

Когда я конвертирую 0x421F в двоичный файл и делю его пополам, я получаю 0x42 и 0x1F, однако проблема с менее значимым байтом 0x1F заключается в том, что когда он отправляется, он не дополняется достаточным количеством нулей. Я думаю, что он просто отправляется как ‹11111> вместо ‹00011111> как требуется.

Любая помощь будет ОЧЕНЬ оценена СПАСИБО :)

  • Отправка 0x1F отправит оба полубайта. Возможно ли, что ваша проблема связана с порядком байтов? То есть, ожидает ли ваша машина 16-битное значение со старшим байтом первым или младшим? Вы должны отправить 0x1F, 0x42 вместо 0x42, 0x1F Tod 13.07.2011

serial-portbytearray

Ответы

Ответ 1 · рейтинг 2 · Robert Harvey

byte[] byteToSend = new byte[] { 0x10, 0x02, 0x47, 0x10, 0x03, 0x1F, 0x42 }
                                                               -----^

Или используйте BitConverter (который понимает порядок байтов):

var bytes = BitConverter.GetBytes(0x421F);

Ответ 2 · Mechanical snail

byte[] byteToSend = new byte[] { 0x10, 0x02, 0x47, 0x10, 0x03, 0x1F, 0x42 }
                                                               -----^

Вам нужно перевернуть байты, если целевая машина хочет обратный порядок байтов (вероятно, если это, например, x86). Если это big-endian, используйте

byte[] byteToSend = new byte[] { 0x10, 0x02, 0x47, 0x10, 0x03, 0x42, 0x1F }
                                                               -----^

как писал Роберт Харви.

(Если вы не уверены в правильности байтов, попробуйте оба варианта.)

Ответ 3 · shenhengbin

Это правильно?

        ushort value = 0x421F;
        byte value1 = (byte)(0x421F & 0xFF);
        byte value2 = (byte)(0x421F >> 8);

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы