1 / 1 / 0
Регистрация: 06.04.2017
Сообщений: 17
1

Интерпретация кода в код современного языка

22.01.2021, 12:21. Показов 2105. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!
Мне встретился небольшой код метода который описывает генерацию CRC в одном старом протоколе связи. Вот он:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
var ChanalBuf : array [0..255] of byte;
    var NumByteInChanalBuf : byte;
 
    procedure CalOneByteCRC(aByte: byte);
    var
        i: integer;
        Flag1, Flag2 : Boolean;
    begin
        for i:=0 to 7 do begin
            if Crc_H >= $80 then begin
                Crc_H:=Crc_H xor $C0;
                Crc_L:=Crc_L xor $02;
                aByte:=aByte xor $80;
            end;
            if aByte >= $80 then begin
                Flag1:=True;
                aByte:=aByte and $7F;
            end  else   Flag1:=False;
            aByte := aByte  Shl  1;
            if Crc_L >= $80 then begin
                Flag2:=True;
                Crc_L:=Crc_L and $7F;
            end  else  Flag2:=False;
            Crc_L:= Crc_L  Shl  1;
            if Crc_H >= $80 then
                Crc_H:=Crc_H and $7F;
            Crc_H:= Crc_H Shl 1;
            if Flag1 then
                Crc_L:=Crc_L+1;
            if Flag2 then
                Crc_H:=Crc_H + 1;
        end;
    end;
 
    procedure CalCRC;
    var
        i: integer;
    begin
        Crc_H:=0;
        Crc_L:=0;
        for i:=0 to NumByteInChanalBuf - 1 do begin
            CalOneByteCRC(ChanalBuf [i]);
        end;
        CalOneByteCRC(0);
        CalOneByteCRC(0);
    end;
Если я верно понял это участок кода Pascal. Я программирую на С#, и с Pascal не знаком, я был бы очень благодарен если б кто-то помог мне его переписать в понятный современный язык С#, Java или C++, а лучше, словами описать, что поочередно происходит, чтоб я потом написал метод на C#.
Надеюсь на вашу помощь, огромное спасибо!

Добавлено через 19 минут
После выделения кода при публикации поста, код стал намного яснее, думаю мне уже на 99% стало понятнее. Спасибо, пока в помощи не нуждаюсь.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.01.2021, 12:21
Ответы с готовыми решениями:

Приобразование кода языка QBasic машинный код
Приоброзование кода языка QBasic в машинный код. Как это сделать?

Интерпретация кода VBA
Во вложении файлик .xlsm в нем макрос, который я оставил для примера, чтоб понятнее было. Помогите...

[gnu prolog] Декларативная и процедурная интерпретация кода
Сортировка вставкой insert(A,,). insert(A,,]):-A<C,!. insert(A,,):-A>=C, insert(A,B,D)....

Неверная интерпретация кода при включении оптимизации CooCox
uartflag=0; while(1) { if(uartflag==1) { switch (buf) { case 1: //SwitchScreen();...

3
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7769 / 4598 / 2823
Регистрация: 22.11.2013
Сообщений: 13,076
Записей в блоге: 1
22.01.2021, 22:35 2
Там повыше еще пара глобальных переменных была, они имеют непосредственное отношение к:
Pascal
1
2
var
  Crc_L, Crc_H: Byte;
Flag1 и Flag2 используются как флаг переноса при сдвиге влево. Сбрасывать старший бит перед сдвигом влево не было нужды, использовать if для установки флага -- тоже так себе идея.
Строки с 15 по 31 эквивалентны:
Pascal
15
16
17
18
19
20
21
  Flag1:=aByte And $80<>0;
  aByte:=aByte Shl 1;
  Flag2:=Crc_L And $80<>0;
  Crc_L:=Crc_L Shl 1;
  Crc_H:=Crc_H Shl 1;
  Inc(Crc_L,Ord(Flag1));
  Inc(Crc_H,Ord(Flag2));
Добавлено через 23 минуты
Если правильно путаю, в сухом остатке:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
type
  WordRec = packed record
    Lo, Hi: Byte;
  end;
var
  Crc: Word;
  ChanBuf: array [0..255] of Byte;
  ChanBufLen: Byte;
 
procedure ByteCRC(aByte: Byte);
var
  i: Integer;
  Flag1, Flag2: Boolean;
begin
  for i:=0 to 7 do begin
    if Crc And $8000<>0 then begin
      Crc:=Crc xor $C002;
      aByte:=aByte xor $80;
    end;
    Flag1:=aByte And $80<>0;
    aByte:=aByte Shl 1;
    Flag2:=Crc And $80<>0;
    Crc:=Crc Shl 1;
    Inc(WordRec(Crc).Lo,Ord(Flag1));
    Inc(WordRec(Crc).Hi,Ord(Flag2));
  end;
end;
 
procedure CalCRC;
var i: Integer;
begin
  Crc:=0;
  for i:=0 to ChanBufLen-1 do
    ByteCRC(ChanBuf[i]);
  ByteCRC(0);
  ByteCRC(0);
end;
1
1 / 1 / 0
Регистрация: 06.04.2017
Сообщений: 17
27.01.2021, 14:09  [ТС] 3
В общем, написать робочий код по этим процедурам мне не удалось. Но я установил косвенным путем, что этим куском кода хотели "описать" и "объяснить" алгоритм подсчета CRC-16/BUYPASS.
Если кто-то, когда-то, встретит подобную дичь, как в моем первом сообщении, то вот мой рабочий вариант кода на С#:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
        /// <summary>
        /// CRC-16 non-reversive algorithm
        /// </summary>
        /// <param name="data">Data bytes</param>
        /// <param name="poly">Generator polynomial</param>
        /// <param name="crc">Initial CRC-value</param>
        /// <returns>16-bit CRC value</returns>
        private static ushort CRC16_non_reversive_algorithm(byte[] data, ushort poly, ushort crc)
        {
            foreach (var item in data) // For each byte in buffer
            {
                crc ^= (ushort)(item << 8); // Move byte into HI-byte to be the same length as 16bit CRC
 
                for (int i = 0; i < 8; i++) // For each bit in byte
                {
                    if ((crc & 0x8000) != 0) // If MSB = 1
                    {
                        crc <<= 1;
                        crc ^= poly;
                    }
                    else
                    {
                        crc <<= 1;
                    }
                }
            }
            return crc;
        }
 
        // Generator polynomial: 0x8005
        // Initial CRC-value: 0x0000
        public static ushort CRC16_BUYPASS(byte[] data)
        {
            return CRC16_non_reversive_algorithm(data, 0x8005, 0x0000);
        }
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7769 / 4598 / 2823
Регистрация: 22.11.2013
Сообщений: 13,076
Записей в блоге: 1
27.01.2021, 16:50 4
Если этот код верен, то
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function CRC16(const data: array of Byte; poly, crc: Word): Word;
var b: byte; i: Integer;
begin
  for b in data do begin
    crc:=Word(b) shl 8 xor crc;
    for i:=7 downto 0 do
      if crc and $8000=0 then
        crc:=crc shl 1
      else
        crc:=crc shl 1 xor poly;
  CRC16:=crc;
end;
 
function CRC16_BUYPASS(const data: array of Byte):Word;
begin
  CRC16_BUYPASS:=CRC16(data,$8005,0);
end;
Добавлено через 15 минут
Ах да, обратите внимание, в оригинале захардкожено два завершающих нуля в data.
0
27.01.2021, 16:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.01.2021, 16:50
Помогаю со студенческими работами здесь

Транслировать заданный код с языка Pascal в исходный код ассемблер
Транслировать заданный код с языка Pascal в исходный код ассемблерVar a:byte; b:byte; c:word;...

Вставить в код C#, код из другого языка программирования
Всем привет! Хочу спросить можно вставить в код C# код из другого языка программирования, например...

Перевод кода с языка C# на F#
Срочно понадобился перевод этой программы в среду F#, или хотя бы аналог по функциональности, буду...

Перевод кода с языка С на С++
Привет! Имею проблему.. Написал код на С но сложно перевести на С++ #include &lt;stdio.h&gt;...

Перевести кода с языка Java
Помогите пожалуйста, перевести из java в с++. Будьте добры. Вот код java: package beginning; ...

Перевод кода с Си подобного языка
Верно ли переведен код: #include &lt; stdio.h &gt; #include &lt; stdlib.h &gt; #define _USE_MATH_DEFINES...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru