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

Здравствуйте, я относительно новичок в программировании на С# и был бы признателен за помощь. Я пишу программу, которая связывается с машиной через 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> как требуется.

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


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


Ответы (3)


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

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

var bytes = BitConverter.GetBytes(0x421F);
person Robert Harvey    schedule 13.07.2011
comment
даже несмотря на то, что инициализаторы печатаются таким образом, я считаю, что вопрос заключался в том, как разделить произвольное 16-битное значение в коде, а не в том, как изменить для этого статический инициализатор. - person shelleybutterfly; 13.07.2011
comment
Разве это не 0x1F, 0x42 в конце вместо 0x42, 0x1F? Вероятно, это машина с обратным порядком байтов. - person Sasha; 13.07.2011
comment
BitConverter.GetBytes(0x421F) будет упорядочивать их в соответствии с порядком байтов управляющей машины, который может отличаться от порядка байтов цели. - person Mechanical snail; 13.07.2011
comment
На машине Intel (а именно так будет примерно в 99,9 процентах случаев) это прямой порядок следования байтов. - person Robert Harvey; 13.07.2011

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 }
                                                               -----^

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

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

person Mechanical snail    schedule 13.07.2011

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

        ushort value = 0x421F;
        byte value1 = (byte)(0x421F & 0xFF);
        byte value2 = (byte)(0x421F >> 8);
person shenhengbin    schedule 13.07.2011