2017-03-08 100 views
0

我有一個類用於我的協議報頭中的C#8位模256和CRC

public class Header 
{ 
    public UInt16 m_syncBytes; 
    public UInt16 m_DestAddress; 
    public UInt16 m_SourceAddress; 

    public byte m_Protocol; 
    public byte m_SequnceNumber; 

    public byte m_Length; 
    public byte m_HdrCrc; 
} 

我想要計算的報頭塊的字符的8位模256和從m_DestAddressm_Length

我遇到過很多16位CRC在線的例子,但找不到8位的Modulo 256和CRC。如果有人能夠解釋如何計算,那將會很棒。

+0

你就不能'字節CRC =(字節)(bytes.Take(m_Length).SUM()%256);'? – itsme86

+0

@ itsme86 - 'm_Length'不是標題的長度。它是數據部分的長度 – liv2hak

+0

你說你想創建一個頭塊字符的CRC,但是你正在談論從'm_DestAddress'到'm_Length',你說的是在數據部分。目前還不清楚你想要做什麼。你在說頭的字節嗎?像6個字節?你如何將標題存儲在內存中?你必須小心一些關於.Net如何在內部存儲這些屬性的假設。或者,只需將要包含在CRC中的標題元素的值添加到一起,然後對其進行取模。 – itsme86

回答

2

這是我做的方式:

public byte GetCRC() 
{ 
    int crc; // 32-bits is more than enough to hold the sum and int will make it easier to math 
    crc = (m_DestAddress & 0xFF) + (m_DestAddress >> 8); 
    crc += (m_SourceAddress & 0xFF) + (m_SourceAddress >> 8); 
    crc += m_Protocol; 
    crc += m_SequenceNumber; 
    crc += m_Length; 

    return (byte)(crc % 256); // Could also just do return (byte)(crc & 0xFF); 
}