Ver Mensaje Individual
  #1732  
Antiguo 02-10-2021
andalusoft andalusoft is offline
Miembro
 
Registrado: sep 2021
Posts: 10
Reputación: 0
andalusoft Va por buen camino
Calculo CRC-8

Hola a tod@s.

Os dejo código fuente para calcular el CRC-8:

MICROFOCUS COBOL:

$set sourceformat(variable)
program-id. CRC8 as "CRC8".

environment division.
configuration section.

data division.
working-storage section.

01 CRC8-Table.
05 filler occurs 256.
10 tbByte PIC X(1).
10 tbByteNum redefines tbByte PIC S9(2) COMP-5.

01 cadena PIC X(256) VALUE
"TBAI-00000006Y-251019-btFpwP8dcLGAF-".
01 len PIC 9(2) COMP-5.
01 crc PIC X(1).
01 crcNum redefines crc PIC 9(2) comp-5.
01 crcNumInt PIC S9(9) COMP-5.

01 idx-1 PIC 9(2) COMP-5.

01 tmpChar PIC X(1).
01 tmpIdx redefines tmpChar PIC S9(2) COMP-5.
01 tmpIdxInt PIC S9(9) COMP-5.

procedure division.

perform chargeTable
perform getLen

move 1 to idx-1
move 0 to crcNumInt

perform until idx-1 > len
move cadena(idx-1:1) to tmpChar
move tmpIdx to tmpIdxInt

call "CBL_XOR" using crcNumInt tmpIdxInt by value 4
display tmpIdxInt " " no advancing

call "CBL_AND" using X"FF000000" tmpIdxInt by value 4
display tmpIdxInt " "
tbByteNum(tmpIdxInt + 1) " " no advancing

move tbByte(tmpIdxInt + 1) to crc
move crcNum to crcNumInt

display crcNumInt " "

add 1 to idx-1
end-perform

call "CBL_AND" using X"FF000000" crcNumInt by value 4

display crcNumInt

move crcNumInt to crcNum

display crcNum " " crc

goback
.


chargeTable.
string
X"00", X"07", X"0E", X"09",
X"1C", X"1B", X"12", X"15", X"38", X"3F", X"36", X"31",
X"24", X"23", X"2A", X"2D", X"70", X"77", X"7E", X"79",
X"6C", X"6B", X"62", X"65", X"48", X"4F", X"46", X"41",

X"54", X"53", X"5A", X"5D", X"E0", X"E7", X"EE", X"E9",
X"FC", X"FB", X"F2", X"F5", X"D8", X"DF", X"D6", X"D1",
X"C4", X"C3", X"CA", X"CD", X"90", X"97", X"9E", X"99",
X"8C", X"8B", X"82", X"85", X"A8", X"AF", X"A6", X"A1",
X"B4", X"B3", X"BA", X"BD", X"C7", X"C0", X"C9", X"CE",
X"DB", X"DC", X"D5", X"D2", X"FF", X"F8", X"F1", X"F6",
X"E3", X"E4", X"ED", X"EA", X"B7", X"B0", X"B9", X"BE",
X"AB", X"AC", X"A5", X"A2", X"8F", X"88", X"81", X"86",
X"93", X"94", X"9D", X"9A", X"27", X"20", X"29", X"2E",
X"3B", X"3C", X"35", X"32", X"1F", X"18", X"11", X"16",
X"03", X"04", X"0D", X"0A", X"57", X"50", X"59", X"5E",
X"4B", X"4C", X"45", X"42", X"6F", X"68", X"61", X"66",
X"73", X"74", X"7D", X"7A", X"89", X"8E", X"87", X"80",
X"95", X"92", X"9B", X"9C", X"B1", X"B6", X"BF", X"B8",
X"AD", X"AA", X"A3", X"A4", X"F9", X"FE", X"F7", X"F0",
X"E5", X"E2", X"EB", X"EC", X"C1", X"C6", X"CF", X"C8",
X"DD", X"DA", X"D3", X"D4", X"69", X"6E", X"67", X"60",
X"75", X"72", X"7B", X"7C", X"51", X"56", X"5F", X"58",
X"4D", X"4A", X"43", X"44", X"19", X"1E", X"17", X"10",
X"05", X"02", X"0B", X"0C", X"21", X"26", X"2F", X"28",
X"3D", X"3A", X"33", X"34", X"4E", X"49", X"40", X"47",
X"52", X"55", X"5C", X"5B", X"76", X"71", X"78", X"7F",
X"6A", X"6D", X"64", X"63", X"3E", X"39", X"30", X"37",
X"22", X"25", X"2C", X"2B", X"06", X"01", X"08", X"0F",
X"1A", X"1D", X"14", X"13", X"AE", X"A9", X"A0", X"A7",
X"B2", X"B5", X"BC", X"BB", X"96", X"91", X"98", X"9F",
X"8A", X"8D", X"84", X"83", X"DE", X"D9", X"D0", X"D7",
X"C2", X"C5", X"CC", X"CB", X"E6", X"E1", X"E8", X"EF",
X"FA", X"FD", X"F4", X"F3"
delimited by size into CRC8-Table
.

getLen.

move 36 to len

*> Fujitsu: function stored-cahr-length
*> Otros: un bucle, unstring con x"00" o NOT = SPACES etc.
.

end program CRC8.


WINDEV:


PROCEDURE calcular_CRC8(Cadena is UNICODE string)

CRC8_Table is array of byte = [0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15, 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D,
0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65, 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D,
0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5, 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD,
0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85, 0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD,
0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2, 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA,
0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2, 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A,
0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32, 0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A,
0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42, 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A,
0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C, 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4,
0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC, 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4,
0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C, 0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44,
0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C, 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34,
0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B, 0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63,
0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B, 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13,
0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB, 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83,
0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB, 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3]

Idx_1 is int = 1
Len is int = Length(Cadena)

TmpIdx is bytes = 0

CrcNum is byte = 0
CRC is UNICODE string = ""

Cadena = StringToUTF8(Cadena,charsetUTF8)

FOR Idx_1 = 1 TO Len
TmpIdx = Asc(Middle(Cadena,Idx_1,1))
TmpIdx = BinaryXOR(CrcNum,TmpIdx)
TmpIdx = BinaryAND(0xFF,TmpIdx)
CrcNum = CRC8_Table[TmpIdx + 1]
END

CrcNum = BinaryAND(0xFF,CrcNum)

CRC = NumToString(CrcNum,"%03d")

RESULT = CRC

Saludos y gracias por todo.
Responder Con Cita