EssenceGold Ответов: 3

Вычисление контрольной суммы кадра C#


Hii guys. I have a problem. Can you help me. There is an article on the elimination. According to this article I can not find Checksum. Here are a few examples and articles;


Статьи:

2.1 кадрирование

Каждая передача данных происходит в пределах кадра. Каждый пакет данных имеет следующую структуру:
&ЛТ;компания&ГТ; ФЛ ФН в Интернет [сведения] контрольная сумма &ЛТ;ЕТХ&ГТ;
<STX> 1 байт (02hex) Начало кадра
FL 3 байтовая длина кадра, в настоящее время не используется, заполнена пробелами (20hex)
FN 2-байтовый номер кадра, не используемый в настоящее время, заполненный пробелами (20hex)
FI 2-байтовый идентификатор кадра, только "E", "I", " D " и " S " используются для 1. Байт
в настоящее время, 2. Байт всегда пустой (20hex)
[Данные] данные приложения (если таковые имеются)
Контрольная Сумма 2 Байта Контрольная Сумма
<ETX> 1 байт (03hex) завершение кадра

2.2 обнаружение ошибок и управление потоком

Для обеспечения целостности данных контрольная сумма передается с каждым кадром. Эта контрольная сумма
вычисляется путем сложения значений всех переданных байтов из <stx> В [DATA] (оба
включительно), модуль 100hex. Сумма делится на 10hex. 30hex добавляется к обоим
частное и остаток от деления. Результаты (ASCII ‘0’ -‘?’) представляют собой контрольную сумму из 2 символов. Например, сумма 3f9hex приведет к “?9”.



Пример Журнала Связи;

HCTS -> LIS <STX>..... D.BI/1234ABC5678/30500000/?7<ETX> --- контрольная сумма ?7
LIS -> HCTS <ACK>
Лис -&ГТ; HCTS &ЛТ;компания&ГТ;.....Д. Д. У.|1234ABC5678|||чоле....BILI_TOT|5=&ЛТ;ЕТХ&ГТ; --- контрольная сумма 5=
HCTS -> LIS: <ACK>

HCTS -&ГТ; лис &ЛТ;компания&ГТ;.....Д. Би|1234ABC5678|D050000F|1&ГТ;&ЛТ;ЕТХ&ГТ; -----контрольная сумма 1&ГТ;
LIS -> HCTS <ACK>
HCTS -> LIS <STX>..... D.BI/9555907034/A000000B|;7<ETX> - - - - - - контрольная сумма ;7
HCTS -> LIS <STX>..... D.BI//A000000Z/<0<ETX> - - - - - - - контрольная сумма <0

Не: ..... = пусто

Я не рассчитал контрольную сумму. Где я делаю ошибки?

Что я уже пробовал:

public string ConvertToHex(string asciiString)
       {
           string hex = "";
           foreach (char c in asciiString)
           {
               int tmp = c;
               hex += string.Format("{0:X2}", Convert.ToUInt32(tmp.ToString()));
           }
           return hex;
       }


public static byte[] StringToByteArray(string text)
       {
           return Enumerable.Range(0, text.Length)
                            .Where(x => x % 2 == 0)
                            .Select(x => Convert.ToByte(text.Substring(x, 2), 16))
                            .ToArray();
       }


private void button2_Click(object sender, EventArgs e)
       {         
           string hex = ConvertToHex(dataBox.Text);
           int total = StringToByteArray(hex).Sum(x => x);
           string totalStr = string.Format("{0:x}", total);
           resultBox.Text = totalStr;
       }

3 Ответов

Рейтинг:
2

CPallini

public static byte [] chk( byte [] buffer)
{
  int sum = 0;
  foreach ( var b in buffer)
    sum += b;
  sum %= 0x100;
  byte [] ch = new byte[2];
  ch[0] = (byte) ((sum >> 4) + 0x30);
  ch[1] = (byte) ((sum & 0xF) + 0x30);
  return ch;
}


EssenceGold

В качестве примера приведем расчет этой последовательности. Пожалуйста, укажите все коды. Спасибо.

&ЛТ;компания&ГТ;.....Д. Би|1234ABC5678|30500000|?7&ЛТ;ЕТХ&ГТ;

CPallini

Что означает точка ('.') стенд для? Что означает труба ('|')?

EssenceGold

..... Заполняется пробелами ( пробел по количеству точек )

| делитель. Символ трубы ASCII 0x7C (я не уверен в этом) В статье об этом нет никакой информации

CPallini

Вы должны быть уверены. Должен ли делитель быть включен или нет в вычисление контрольной суммы?

EssenceGold

Работает в двух направлениях.

Примеры потока данных для протокола версии 1
HCTS -&ГТ; лис &ЛТ;компания&ГТ;·····Д·BI01234ABC567830500000;3&ЛТ;ЕТХ&ГТ;

Примеры потока данных для протокола версии 2
HCTS -> LIS <STX>···· * D·BI|1234ABC5678|30500000|?7<ETX>


Но контрольная сумма другая. Вероятно, входит в расчет. Протокол 1 с использованием 0 нуля
Протокол 2 Использование | труба

Моя голова хорошо перемешалась :(

Рейтинг:
2

Ztibi

private string Pruefsumme(строковый буфер)
{
int i;
инт сумма;
сумма = 256;
для (i = 0; i < буфер.Длина; i++)
{
sum -= буфер[i];
if (sum < 0)
{
сумма += 256;
}
}
Pruefsumme_a1 = (sum & 0xF0) >> 4;
a2 = сумма & 0x0F;
Pruefsumme_Hex = Строковые Функции.ChangeCharacter(Pruefsumme_Hex, 0, ASCII[Pruefsumme_a1]);
Pruefsumme_Hex = Строковые Функции.ChangeCharacter(Pruefsumme_Hex, 1, ASCII[a2]);
Pruefsumme_Hex = Pruefsumme_Hex.Substring(0, 2);
возвращение (Pruefsumme_Hex);
}


внутренние статические функции класса StringFunctions
{

public static string ChangeCharacter(string sourceString, int charIndex, char newChar)
{
return (charIndex > 0 ? sourceString.Подстрока(0, charIndex) : "")
+ newChar.ToString() + (charIndex < sourceString.Длина - 1 ? sourceString.Подстрока(charIndex + 1) : "");
}

public static bool IsXDigit(символ char)
{
если (char.IsDigit(символ))
вернуть true;
еще если ("ABCDEFabcdef".IndexOf(символ) > -1)
вернуть true;
еще
возвращать false;
}


открытые статические строковые функции strchr(строка stringToSearch, шар charToFind)
{
int index = stringToSearch.Метод indexOf(charToFind);
if (индекс > -1)
верните stringToSearch.Подстрока(индекс);
еще
возвращать null;
}


публичная статическая строка StrRChr(string stringToSearch, char charToFind)
{
int index = stringToSearch.LastIndexOf(charToFind);
if (индекс > -1)
верните stringToSearch.Подстрока(индекс);
еще
возвращать null;
}


публичная статическая строка StrStr(string stringToSearch, string stringToFind)
{
int index = stringToSearch.Метод indexOf(stringToFind);
if (индекс > -1)
верните stringToSearch.Подстрока(индекс);
еще
возвращать null;
}

частная статическая строка activeString;
частная статическая int activePosition;
публичная статическая строка StrTok(string stringToTokenize, разделители строк)
{
if (stringToTokenize != null)
{
activeString = stringToTokenize;
активная позиция = -1;
}


if (activeString == null)
возвращать null;

if (activePosition == activeString.Длина)
возвращать null;

activePosition++;
while (activePosition < activeString.Длина && разделители.IndexOf(activeString[activePosition]) > -1)
{
activePosition++;
}

if (activePosition == activeString.Длина)
возвращать null;

int startingPosition = активная позиция;
делать
{
activePosition++;
} while (activePosition < activeString.Длина && разделители.IndexOf(activeString[activePosition]) == -1);

верните activeString.Подстрока(startingPosition, activePosition - startingPosition);
}

}


Ztibi

Просто строковые данные = "{STX}1"; - - - - >> D8 я надеюсь, что смогу помочь. :-)

Рейтинг:
15

EssenceGold

// Full data : <STX>     D BI|1234ABC5678|30500000|?7<ETX>

// Data to be calculated = <STX>     D BI|1234ABC5678|30500000|

// Result = ?7

public string ConvertToHex(string asciiString)
       {
           string hex = "";
           foreach (char c in asciiString)
           {
               int tmp = c;
               hex += string.Format("{0:X2}", Convert.ToUInt32(tmp.ToString()));
           }
           return hex;
       }

public static byte[] StringToByteArray(string text)
       {
           return Enumerable.Range(0, text.Length)
                            .Where(x => x % 2 == 0)
                            .Select(x => Convert.ToByte(text.Substring(x, 2), 16))
                            .ToArray();
       }

private static string Csum(string data)
       {
           int total = StringToByteArray(data).Sum(x => x);
           total %= 0x100;
           string totalStr = string.Format("{0:x2}", total);
           int hexa = int.Parse(totalStr.Substring(0, 1), NumberStyles.HexNumber) + 0x30;
           int hexb = int.Parse(totalStr.Substring(1, 1), NumberStyles.HexNumber) + 0x30;
           char a = (char)hexa, b = (char)hexb;
           data = a + b.ToString();
           return data;
       }

private void button2_Click(object sender, EventArgs e)
      {
          try
          {
              string hexstring = "02" + ConvertToHex(dataBox.Text.Replace("<STX>", ""));            
              sumBox.Text = Csum(hexstring);
          }
          catch (Exception)
          {
              sumBox.Text = "??";
          }
      }