2011-07-13 94 views
0

您好,我對C#編程相對較新,希望得到一些幫助,我正在編寫一個程序,它通過RS232與一臺機器進行通信,並需要發送一系列字節來啓動com。我在,我想我需要分成兩個字節,以適應字節C#幫助將兩個字節的字拆分爲字節

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

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

數組當我轉換0x421F成二進制數據包的末尾有兩個字節的16位CRC字,它分成兩半我得到0x42和0x1F 然而,較低有效字節0x1F的問題是它發送時沒有填充足夠的零。我認爲它只是根據需要發送爲< 11111>而不是< 00011111>。

任何幫助,將不勝感激 感謝 :)

+0

發送0x1F將發送兩個半字節。是否有可能你的問題與永恆性有關?那就是說,如果你的機器需要一個16位的值,並且最重要的字節在前或者最小?你必須發送0x1F,0x42而不是0x42,0x1F – Tod

回答

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

或者使用BitConverter(其理解字節序):

var bytes = BitConverter.GetBytes(0x421F); 
+0

即使初始化程序是這樣打印的,我相信問題是如何在代碼中分割任意16位值,而不是如何更改靜態初始化程序來執行此操作。 – shelleybutterfly

+0

它不是0x1F,0x42在結尾而不是0x42,0x1F?這可能是一個小端機器。 – Sasha

+0

'BitConverter.GetBytes(0x421F)'會根據*控制*機器的字節順序排列它們,這可能與目標的字節順序不同。 –

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

你需要的,如果的字節翻轉目標機器需要little-endian(可能如果它是例如x86)。如果是大端,請使用

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

正如Robert Harvey所寫。

(如果您不確定字節順序,只需嘗試兩種方法。)

0

這是正確的嗎?

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