CRC-8 (Euskadi TicketBai)

CRC-8 calc with 4D:

PDF with Java CRC calculation:
https://www.gipuzkoa.eus/documents/2456431/12093238/TicketBAI_Especificaciones_v_1_0.pdf/81aa2a72-2e5a-b0b5-e990-eb3a307c72bb

The last page of the pdf above, explains how to calculate CRC-8 with Java. I don’t know how to do it in 4D.

In the database attached (4D v17) is all what I am able to do, more exactly, what I am not able to do, and some 4D methods I found to calculate CRC-32 but I dont know how to adjust them to CRC-8.

Any help would be great appreciate. TIA.

https://forums.4d.com/4DBB_Main/x_User/4915/files/33524661.zip

Hi Bruno,

: Bruno LEGAY

There are several CRC8 flavours (look at the comment in the CRC_8
method)…

Yes, CRC-8-CCITT is the polynomial in this case.

I’m going to try with your code just now.

Thanks a lot.

Hi Bruno,

Thanks for your code, it works fine, except by generating the byte table, which does not match the one shown on the last page of the PDF that I link above. I am sure your code is correct. I have seen many examples, in PHP especially, that also fail trying to create it by code (loop) and I have seen examples that create it manually, something similar to what I have done:

ARRAY LONGINT(jArrCRC8_table;255)

jArrCRC8_table{0}:=0x0000
jArrCRC8_table{1}:=0x0007
and so on until
jArrCRC8_table{255}:=0x00F3

Using my table with your code, I get the correct CRC.
Just out of curiosity, do you know why this happens?

Regards.

Here is the code which matches the specs your provided (sorry, I did look at your link before).

Not tested…

<code 4D>

C_ENTIER LONG($0;$vl_crc) //CRC16
C_POINTEUR($1;$vp_blobPtr) //blob ptr

C_ENTIER LONG($vl_nbParam)
$vl_nbParam:=Nombre de paramètres
Si ($vl_nbParam>0)
$vp_blobPtr:=$1

C_BLOB($vx_lookup)
FIXER TAILLE BLOB($vx_lookup;255;0x0000)

// https://www.gipuzkoa.eus/documents/2456431/12093238/TicketBAI_Especificaciones_v_1_0.pdf/81aa2a72-2e5a-b0b5-e990-eb3a307c72bb

Si (Vrai)

$vx_lookup{0}:=0x0000
$vx_lookup{1}:=0x0007
$vx_lookup{2}:=0x000E
$vx_lookup{3}:=0x0009
$vx_lookup{4}:=0x001C
$vx_lookup{5}:=0x001B
$vx_lookup{6}:=0x0012
$vx_lookup{7}:=0x0015
$vx_lookup{8}:=0x0038
$vx_lookup{9}:=0x003F
$vx_lookup{10}:=0x0036
$vx_lookup{11}:=0x0031
$vx_lookup{12}:=0x0024
$vx_lookup{13}:=0x0023
$vx_lookup{14}:=0x002A
$vx_lookup{15}:=0x002D
$vx_lookup{16}:=0x0070
$vx_lookup{17}:=0x0077
$vx_lookup{18}:=0x007E
$vx_lookup{19}:=0x0079
$vx_lookup{20}:=0x006C
$vx_lookup{21}:=0x006B
$vx_lookup{22}:=0x0062
$vx_lookup{23}:=0x0065
$vx_lookup{24}:=0x0048
$vx_lookup{25}:=0x004F
$vx_lookup{26}:=0x0046
$vx_lookup{27}:=0x0041
$vx_lookup{28}:=0x0054
$vx_lookup{29}:=0x0053
$vx_lookup{30}:=0x005A
$vx_lookup{31}:=0x005D
$vx_lookup{32}:=0x00E0
$vx_lookup{33}:=0x00E7
$vx_lookup{34}:=0x00EE
$vx_lookup{35}:=0x00E9
$vx_lookup{36}:=0x00FC
$vx_lookup{37}:=0x00FB
$vx_lookup{38}:=0x00F2
$vx_lookup{39}:=0x00F5
$vx_lookup{40}:=0x00D8
$vx_lookup{41}:=0x00DF
$vx_lookup{42}:=0x00D6
$vx_lookup{43}:=0x00D1
$vx_lookup{44}:=0x00C4
$vx_lookup{45}:=0x00C3
$vx_lookup{46}:=0x00CA
$vx_lookup{47}:=0x00CD
$vx_lookup{48}:=0x0090
$vx_lookup{49}:=0x0097
$vx_lookup{50}:=0x009E
$vx_lookup{51}:=0x0099
$vx_lookup{52}:=0x008C
$vx_lookup{53}:=0x008B
$vx_lookup{54}:=0x0082
$vx_lookup{55}:=0x0085
$vx_lookup{56}:=0x00A8
$vx_lookup{57}:=0x00AF
$vx_lookup{58}:=0x00A6
$vx_lookup{59}:=0x00A1
$vx_lookup{60}:=0x00B4
$vx_lookup{61}:=0x00B3
$vx_lookup{62}:=0x00BA
$vx_lookup{63}:=0x00BD
$vx_lookup{64}:=0x00C7
$vx_lookup{65}:=0x00C0
$vx_lookup{66}:=0x00C9
$vx_lookup{67}:=0x00CE
$vx_lookup{68}:=0x00DB
$vx_lookup{69}:=0x00DC
$vx_lookup{70}:=0x00D5
$vx_lookup{71}:=0x00D2
$vx_lookup{72}:=0x00FF
$vx_lookup{73}:=0x00F8
$vx_lookup{74}:=0x00F1
$vx_lookup{75}:=0x00F6
$vx_lookup{76}:=0x00E3
$vx_lookup{77}:=0x00E4
$vx_lookup{78}:=0x00ED
$vx_lookup{79}:=0x00EA
$vx_lookup{80}:=0x00B7
$vx_lookup{81}:=0x00B0
$vx_lookup{82}:=0x00B9
$vx_lookup{83}:=0x00BE
$vx_lookup{84}:=0x00AB
$vx_lookup{85}:=0x00AC
$vx_lookup{86}:=0x00A5
$vx_lookup{87}:=0x00A2
$vx_lookup{88}:=0x008F
$vx_lookup{89}:=0x0088
$vx_lookup{90}:=0x0081
$vx_lookup{91}:=0x0086
$vx_lookup{92}:=0x0093
$vx_lookup{93}:=0x0094
$vx_lookup{94}:=0x009D
$vx_lookup{95}:=0x009A
$vx_lookup{96}:=0x0027
$vx_lookup{97}:=0x0020
$vx_lookup{98}:=0x0029
$vx_lookup{99}:=0x002E
$vx_lookup{100}:=0x003B
$vx_lookup{101}:=0x003C
$vx_lookup{102}:=0x0035
$vx_lookup{103}:=0x0032
$vx_lookup{104}:=0x001F
$vx_lookup{105}:=0x0018
$vx_lookup{106}:=0x0011
$vx_lookup{107}:=0x0016
$vx_lookup{108}:=0x0003
$vx_lookup{109}:=0x0004
$vx_lookup{110}:=0x000D
$vx_lookup{111}:=0x000A
$vx_lookup{112}:=0x0057
$vx_lookup{113}:=0x0050
$vx_lookup{114}:=0x0059
$vx_lookup{115}:=0x005E
$vx_lookup{116}:=0x004B
$vx_lookup{117}:=0x004C
$vx_lookup{118}:=0x0045
$vx_lookup{119}:=0x0042
$vx_lookup{120}:=0x006F
$vx_lookup{121}:=0x0068
$vx_lookup{122}:=0x0061
$vx_lookup{123}:=0x0066
$vx_lookup{124}:=0x0073
$vx_lookup{125}:=0x0074
$vx_lookup{126}:=0x007D
$vx_lookup{127}:=0x007A
$vx_lookup{128}:=0x0089
$vx_lookup{129}:=0x008E
$vx_lookup{130}:=0x0087
$vx_lookup{131}:=0x0080
$vx_lookup{132}:=0x0095
$vx_lookup{133}:=0x0092
$vx_lookup{134}:=0x009B
$vx_lookup{135}:=0x009C
$vx_lookup{136}:=0x00B1
$vx_lookup{137}:=0x00B6
$vx_lookup{138}:=0x00BF
$vx_lookup{139}:=0x00B8
$vx_lookup{140}:=0x00AD
$vx_lookup{141}:=0x00AA
$vx_lookup{142}:=0x00A3
$vx_lookup{143}:=0x00A4
$vx_lookup{144}:=0x00F9
$vx_lookup{145}:=0x00FE
$vx_lookup{146}:=0x00F7
$vx_lookup{147}:=0x00F0
$vx_lookup{148}:=0x00E5
$vx_lookup{149}:=0x00E2
$vx_lookup{150}:=0x00EB
$vx_lookup{151}:=0x00EC
$vx_lookup{152}:=0x00C1
$vx_lookup{153}:=0x00C6
$vx_lookup{154}:=0x00CF
$vx_lookup{155}:=0x00C8
$vx_lookup{156}:=0x00DD
$vx_lookup{157}:=0x00DA
$vx_lookup{158}:=0x00D3
$vx_lookup{159}:=0x00D4
$vx_lookup{160}:=0x0069
$vx_lookup{161}:=0x006E
$vx_lookup{162}:=0x0067
$vx_lookup{163}:=0x0060
$vx_lookup{164}:=0x0075
$vx_lookup{165}:=0x0072
$vx_lookup{166}:=0x007B
$vx_lookup{167}:=0x007C
$vx_lookup{168}:=0x0051
$vx_lookup{169}:=0x0056
$vx_lookup{170}:=0x005F
$vx_lookup{171}:=0x0058
$vx_lookup{172}:=0x004D
$vx_lookup{173}:=0x004A
$vx_lookup{174}:=0x0043
$vx_lookup{175}:=0x0044
$vx_lookup{176}:=0x0019
$vx_lookup{177}:=0x001E
$vx_lookup{178}:=0x0017
$vx_lookup{179}:=0x0010
$vx_lookup{180}:=0x0005
$vx_lookup{181}:=0x0002
$vx_lookup{182}:=0x000B
$vx_lookup{183}:=0x000C
$vx_lookup{184}:=0x0021
$vx_lookup{185}:=0x0026
$vx_lookup{186}:=0x002F
$vx_lookup{187}:=0x0028
$vx_lookup{188}:=0x003D
$vx_lookup{189}:=0x003A
$vx_lookup{190}:=0x0033
$vx_lookup{191}:=0x0034
$vx_lookup{192}:=0x004E
$vx_lookup{193}:=0x0049
$vx_lookup{194}:=0x0040
$vx_lookup{195}:=0x0047
$vx_lookup{196}:=0x0052
$vx_lookup{197}:=0x0055
$vx_lookup{198}:=0x005C
$vx_lookup{199}:=0x005B
$vx_lookup{200}:=0x0076
$vx_lookup{201}:=0x0071
$vx_lookup{202}:=0x0078
$vx_lookup{203}:=0x007F
$vx_lookup{204}:=0x006A
$vx_lookup{205}:=0x006D
$vx_lookup{206}:=0x0064
$vx_lookup{207}:=0x0063
$vx_lookup{208}:=0x003E
$vx_lookup{209}:=0x0039
$vx_lookup{210}:=0x0030
$vx_lookup{211}:=0x0037
$vx_lookup{212}:=0x0022
$vx_lookup{213}:=0x0025
$vx_lookup{214}:=0x002C
$vx_lookup{215}:=0x002B
$vx_lookup{216}:=0x0006
$vx_lookup{217}:=0x0001
$vx_lookup{218}:=0x0008
$vx_lookup{219}:=0x000F
$vx_lookup{220}:=0x001A
$vx_lookup{221}:=0x001D
$vx_lookup{222}:=0x0014
$vx_lookup{223}:=0x0013
$vx_lookup{224}:=0x00AE
$vx_lookup{225}:=0x00A9
$vx_lookup{226}:=0x00A0
$vx_lookup{227}:=0x00A7
$vx_lookup{228}:=0x00B2
$vx_lookup{229}:=0x00B5
$vx_lookup{230}:=0x00BC
$vx_lookup{231}:=0x00BB
$vx_lookup{232}:=0x0096
$vx_lookup{233}:=0x0091
$vx_lookup{234}:=0x0098
$vx_lookup{235}:=0x009F
$vx_lookup{236}:=0x008A
$vx_lookup{237}:=0x008D
$vx_lookup{238}:=0x0084
$vx_lookup{239}:=0x0083
$vx_lookup{240}:=0x00DE
$vx_lookup{241}:=0x00D9
$vx_lookup{242}:=0x00D0
$vx_lookup{243}:=0x00D7
$vx_lookup{244}:=0x00C2
$vx_lookup{245}:=0x00C5
$vx_lookup{246}:=0x00CC
$vx_lookup{247}:=0x00CB
$vx_lookup{248}:=0x00E6
$vx_lookup{249}:=0x00E1
$vx_lookup{250}:=0x00E8
$vx_lookup{251}:=0x00EF
$vx_lookup{252}:=0x00FA
$vx_lookup{253}:=0x00FD
$vx_lookup{254}:=0x00F4
$vx_lookup{255}:=0x00F3

Fin de si

//byte crc = 0;
//for (int i = 0; i < len; i++)
//crc = crc8_table[(crc ^ data) & 0xff];
//return String.format("%03d", crc & 0xFFL);

//### Setting Execution Control OFF - Bruno LEGAY 2020.01.28
//%R-
//###

C_ENTIER LONG($vl_initialValue;$vl_finalXor)
$vl_initialValue:=0x0000
$vl_finalXor:=0x00FF

$vl_crc:=$vl_initialValue

C_ENTIER LONG($vl_offset;$vl_size;$vl_byte)
$vl_size:=Taille BLOB($vp_blobPtr->)
Boucle ($vl_offset;0;$vl_size-1)
$vl_byte:=$vp_blobPtr->{$vl_offset}

$vl_crc:=$vx_lookup{($vl_crc ^| $vl_byte) & 0x00FF}
Fin de boucle

$vl_crc:=$vl_crc ^| $vl_finalXor

//### Setting Execution Control ON - Bruno LEGAY 2020.01.28
//%R+
//###

FIXER TAILLE BLOB($vx_lookup;0)
Fin de si
$0:=$vl_crc

</code 4D>

Hi Bruno,

Nice idea to use a blob instead of an array.
I have made some changes to adjust the code to this particular case.
Main changes are:
1.- InitialValue and finalXor, both must be allways 0x0000

2.- $vl_crc:=$vx_lookup{$vl_crc ^| $vl_byte}
instead of
$vl_crc:=$vx_lookup{($vl_crc ^| $vl_byte) & 0x00FF} Don’t ask me why, I have no idea.

Thank you very much for your help.

This is the final code.

Method or object method calling CRC calc.
<code 4D>
// jIdTicketBai = TBAI-00000006Y-251019-btFpwP8dcLGAF-
// CRC should be = 237
// Final string with CRC added: TBAI-00000006Y-251019-btFpwP8dcLGAF-237

$CRC:=CRC_8 (->jIdTicketBai;0x0000;0x0000) // String to calculate the CRC; InitialValue; finalXor
jIdTicketBai:=jIdTicketBai+$CRC

</code 4D>

<code 4D>

//================================================================================
// Metodo: CRC_8
//@author Bruno LEGAY(BLE)- Copyrights A&C Consulting- 2008
//@history CREATION Bruno LEGAY(BLE)- 04/08/2009, 100942- v1.00.00
//@xdoc-end
//================================================================================

//C_LONGINT($0;$vl_crc) //CRC16
C_TEXT($0)
C_LONGINT($vl_crc)

//C_POINTER($1;$vp_blobPtr) //blob ptr
C_POINTER($1;$vp_StringPtr) //string ptr

` In this case InitialValue and finalXor must be allways 0x0000
C_LONGINT($2;$vl_initialValue) //initial value 0x00 or 0xFF(optionnal, default 0xFF)
C_LONGINT($3;$vl_finalXor) //final XOR 0x00 or 0xFF(optionnal, default 0xFF)

C_LONGINT($vl_nbParam)
$vl_nbParam:=Count parameters
If ($vl_nbParam>0)
$vp_StringPtr:=$1
$vl_initialValue:=$2
$vl_finalXor:=$3

TEXT TO BLOB($vp_StringPtr->;$vp_StringBlob;UTF8 text without length)

C_BLOB($vx_lookup)
  //SET BLOB SIZE($vx_lookup;255;0x0000)
SET BLOB SIZE($vx_lookup;256;0x0000)  // 256 Because first element is 0:  $vx_lookup{0}:=0x0000

  // https//www.gipuzkoa.eus/documents/2456431/12093238/TicketBAI_Especificaciones_v_1_0.pdf/81aa2a72-2e5a-b0b5-e990-eb3a307c72bb

If (True)
	
	$vx_lookup{0}:=0x0000
	$vx_lookup{1}:=0x0007
	$vx_lookup{2}:=0x000E
	$vx_lookup{3}:=0x0009
	$vx_lookup{4}:=0x001C
	$vx_lookup{5}:=0x001B
	$vx_lookup{6}:=0x0012
	$vx_lookup{7}:=0x0015
	$vx_lookup{8}:=0x0038
	$vx_lookup{9}:=0x003F
	$vx_lookup{10}:=0x0036
	$vx_lookup{11}:=0x0031
	$vx_lookup{12}:=0x0024
	$vx_lookup{13}:=0x0023
	$vx_lookup{14}:=0x002A
	$vx_lookup{15}:=0x002D
	$vx_lookup{16}:=0x0070
	$vx_lookup{17}:=0x0077
	$vx_lookup{18}:=0x007E
	$vx_lookup{19}:=0x0079
	$vx_lookup{20}:=0x006C
	$vx_lookup{21}:=0x006B
	$vx_lookup{22}:=0x0062
	$vx_lookup{23}:=0x0065
	$vx_lookup{24}:=0x0048
	$vx_lookup{25}:=0x004F
	$vx_lookup{26}:=0x0046
	$vx_lookup{27}:=0x0041
	$vx_lookup{28}:=0x0054
	$vx_lookup{29}:=0x0053
	$vx_lookup{30}:=0x005A
	$vx_lookup{31}:=0x005D
	$vx_lookup{32}:=0x00E0
	$vx_lookup{33}:=0x00E7
	$vx_lookup{34}:=0x00EE
	$vx_lookup{35}:=0x00E9
	$vx_lookup{36}:=0x00FC
	$vx_lookup{37}:=0x00FB
	$vx_lookup{38}:=0x00F2
	$vx_lookup{39}:=0x00F5
	$vx_lookup{40}:=0x00D8
	$vx_lookup{41}:=0x00DF
	$vx_lookup{42}:=0x00D6
	$vx_lookup{43}:=0x00D1
	$vx_lookup{44}:=0x00C4
	$vx_lookup{45}:=0x00C3
	$vx_lookup{46}:=0x00CA
	$vx_lookup{47}:=0x00CD
	$vx_lookup{48}:=0x0090
	$vx_lookup{49}:=0x0097
	$vx_lookup{50}:=0x009E
	$vx_lookup{51}:=0x0099
	$vx_lookup{52}:=0x008C
	$vx_lookup{53}:=0x008B
	$vx_lookup{54}:=0x0082
	$vx_lookup{55}:=0x0085
	$vx_lookup{56}:=0x00A8
	$vx_lookup{57}:=0x00AF
	$vx_lookup{58}:=0x00A6
	$vx_lookup{59}:=0x00A1
	$vx_lookup{60}:=0x00B4
	$vx_lookup{61}:=0x00B3
	$vx_lookup{62}:=0x00BA
	$vx_lookup{63}:=0x00BD
	$vx_lookup{64}:=0x00C7
	$vx_lookup{65}:=0x00C0
	$vx_lookup{66}:=0x00C9
	$vx_lookup{67}:=0x00CE
	$vx_lookup{68}:=0x00DB
	$vx_lookup{69}:=0x00DC
	$vx_lookup{70}:=0x00D5
	$vx_lookup{71}:=0x00D2
	$vx_lookup{72}:=0x00FF
	$vx_lookup{73}:=0x00F8
	$vx_lookup{74}:=0x00F1
	$vx_lookup{75}:=0x00F6
	$vx_lookup{76}:=0x00E3
	$vx_lookup{77}:=0x00E4
	$vx_lookup{78}:=0x00ED
	$vx_lookup{79}:=0x00EA
	$vx_lookup{80}:=0x00B7
	$vx_lookup{81}:=0x00B0
	$vx_lookup{82}:=0x00B9
	$vx_lookup{83}:=0x00BE
	$vx_lookup{84}:=0x00AB
	$vx_lookup{85}:=0x00AC
	$vx_lookup{86}:=0x00A5
	$vx_lookup{87}:=0x00A2
	$vx_lookup{88}:=0x008F
	$vx_lookup{89}:=0x0088
	$vx_lookup{90}:=0x0081
	$vx_lookup{91}:=0x0086
	$vx_lookup{92}:=0x0093
	$vx_lookup{93}:=0x0094
	$vx_lookup{94}:=0x009D
	$vx_lookup{95}:=0x009A
	$vx_lookup{96}:=0x0027
	$vx_lookup{97}:=0x0020
	$vx_lookup{98}:=0x0029
	$vx_lookup{99}:=0x002E
	$vx_lookup{100}:=0x003B
	$vx_lookup{101}:=0x003C
	$vx_lookup{102}:=0x0035
	$vx_lookup{103}:=0x0032
	$vx_lookup{104}:=0x001F
	$vx_lookup{105}:=0x0018
	$vx_lookup{106}:=0x0011
	$vx_lookup{107}:=0x0016
	$vx_lookup{108}:=0x0003
	$vx_lookup{109}:=0x0004
	$vx_lookup{110}:=0x000D
	$vx_lookup{111}:=0x000A
	$vx_lookup{112}:=0x0057
	$vx_lookup{113}:=0x0050
	$vx_lookup{114}:=0x0059
	$vx_lookup{115}:=0x005E
	$vx_lookup{116}:=0x004B
	$vx_lookup{117}:=0x004C
	$vx_lookup{118}:=0x0045
	$vx_lookup{119}:=0x0042
	$vx_lookup{120}:=0x006F
	$vx_lookup{121}:=0x0068
	$vx_lookup{122}:=0x0061
	$vx_lookup{123}:=0x0066
	$vx_lookup{124}:=0x0073
	$vx_lookup{125}:=0x0074
	$vx_lookup{126}:=0x007D
	$vx_lookup{127}:=0x007A
	$vx_lookup{128}:=0x0089
	$vx_lookup{129}:=0x008E
	$vx_lookup{130}:=0x0087
	$vx_lookup{131}:=0x0080
	$vx_lookup{132}:=0x0095
	$vx_lookup{133}:=0x0092
	$vx_lookup{134}:=0x009B
	$vx_lookup{135}:=0x009C
	$vx_lookup{136}:=0x00B1
	$vx_lookup{137}:=0x00B6
	$vx_lookup{138}:=0x00BF
	$vx_lookup{139}:=0x00B8
	$vx_lookup{140}:=0x00AD
	$vx_lookup{141}:=0x00AA
	$vx_lookup{142}:=0x00A3
	$vx_lookup{143}:=0x00A4
	$vx_lookup{144}:=0x00F9
	$vx_lookup{145}:=0x00FE
	$vx_lookup{146}:=0x00F7
	$vx_lookup{147}:=0x00F0
	$vx_lookup{148}:=0x00E5
	$vx_lookup{149}:=0x00E2
	$vx_lookup{150}:=0x00EB
	$vx_lookup{151}:=0x00EC
	$vx_lookup{152}:=0x00C1
	$vx_lookup{153}:=0x00C6
	$vx_lookup{154}:=0x00CF
	$vx_lookup{155}:=0x00C8
	$vx_lookup{156}:=0x00DD
	$vx_lookup{157}:=0x00DA
	$vx_lookup{158}:=0x00D3
	$vx_lookup{159}:=0x00D4
	$vx_lookup{160}:=0x0069
	$vx_lookup{161}:=0x006E
	$vx_lookup{162}:=0x0067
	$vx_lookup{163}:=0x0060
	$vx_lookup{164}:=0x0075
	$vx_lookup{165}:=0x0072
	$vx_lookup{166}:=0x007B
	$vx_lookup{167}:=0x007C
	$vx_lookup{168}:=0x0051
	$vx_lookup{169}:=0x0056
	$vx_lookup{170}:=0x005F
	$vx_lookup{171}:=0x0058
	$vx_lookup{172}:=0x004D
	$vx_lookup{173}:=0x004A
	$vx_lookup{174}:=0x0043
	$vx_lookup{175}:=0x0044
	$vx_lookup{176}:=0x0019
	$vx_lookup{177}:=0x001E
	$vx_lookup{178}:=0x0017
	$vx_lookup{179}:=0x0010
	$vx_lookup{180}:=0x0005
	$vx_lookup{181}:=0x0002
	$vx_lookup{182}:=0x000B
	$vx_lookup{183}:=0x000C
	$vx_lookup{184}:=0x0021
	$vx_lookup{185}:=0x0026
	$vx_lookup{186}:=0x002F
	$vx_lookup{187}:=0x0028
	$vx_lookup{188}:=0x003D
	$vx_lookup{189}:=0x003A
	$vx_lookup{190}:=0x0033
	$vx_lookup{191}:=0x0034
	$vx_lookup{192}:=0x004E
	$vx_lookup{193}:=0x0049
	$vx_lookup{194}:=0x0040
	$vx_lookup{195}:=0x0047
	$vx_lookup{196}:=0x0052
	$vx_lookup{197}:=0x0055
	$vx_lookup{198}:=0x005C
	$vx_lookup{199}:=0x005B
	$vx_lookup{200}:=0x0076
	$vx_lookup{201}:=0x0071
	$vx_lookup{202}:=0x0078
	$vx_lookup{203}:=0x007F
	$vx_lookup{204}:=0x006A
	$vx_lookup{205}:=0x006D
	$vx_lookup{206}:=0x0064
	$vx_lookup{207}:=0x0063
	$vx_lookup{208}:=0x003E
	$vx_lookup{209}:=0x0039
	$vx_lookup{210}:=0x0030
	$vx_lookup{211}:=0x0037
	$vx_lookup{212}:=0x0022
	$vx_lookup{213}:=0x0025
	$vx_lookup{214}:=0x002C
	$vx_lookup{215}:=0x002B
	$vx_lookup{216}:=0x0006
	$vx_lookup{217}:=0x0001
	$vx_lookup{218}:=0x0008
	$vx_lookup{219}:=0x000F
	$vx_lookup{220}:=0x001A
	$vx_lookup{221}:=0x001D
	$vx_lookup{222}:=0x0014
	$vx_lookup{223}:=0x0013
	$vx_lookup{224}:=0x00AE
	$vx_lookup{225}:=0x00A9
	$vx_lookup{226}:=0x00A0
	$vx_lookup{227}:=0x00A7
	$vx_lookup{228}:=0x00B2
	$vx_lookup{229}:=0x00B5
	$vx_lookup{230}:=0x00BC
	$vx_lookup{231}:=0x00BB
	$vx_lookup{232}:=0x0096
	$vx_lookup{233}:=0x0091
	$vx_lookup{234}:=0x0098
	$vx_lookup{235}:=0x009F
	$vx_lookup{236}:=0x008A
	$vx_lookup{237}:=0x008D
	$vx_lookup{238}:=0x0084
	$vx_lookup{239}:=0x0083
	$vx_lookup{240}:=0x00DE
	$vx_lookup{241}:=0x00D9
	$vx_lookup{242}:=0x00D0
	$vx_lookup{243}:=0x00D7
	$vx_lookup{244}:=0x00C2
	$vx_lookup{245}:=0x00C5
	$vx_lookup{246}:=0x00CC
	$vx_lookup{247}:=0x00CB
	$vx_lookup{248}:=0x00E6
	$vx_lookup{249}:=0x00E1
	$vx_lookup{250}:=0x00E8
	$vx_lookup{251}:=0x00EF
	$vx_lookup{252}:=0x00FA
	$vx_lookup{253}:=0x00FD
	$vx_lookup{254}:=0x00F4
	$vx_lookup{255}:=0x00F3
	
End if 

  //byte crc= 0;
  //for(int i= 0; i< len; i++)
  //crc= crc8_table[(crc^ data)& 0xff];
  //return String.format("%03d", crc& 0xFFL);

  //### Setting Execution Control OFF- Bruno LEGAY 2020.01.28
  //%R-
  //###

  //C_LONGINT($vl_initialValue;$vl_finalXor)
  //$vl_initialValue:=0x0000
  //$vl_finalXor:=0x00FF

$vl_crc:=$vl_initialValue

C_LONGINT($vl_offset;$vl_size;$vl_byte)
$vl_size:=BLOB size($vp_StringBlob)
For ($vl_offset;0;$vl_size-1)
	$vl_byte:=$vp_StringBlob{$vl_offset}
	
	  //$vl_crc:=$vx_lookup{($vl_crc ^| $vl_byte) & 0x00FF}
	$vl_crc:=$vx_lookup{$vl_crc ^| $vl_byte}
	
End for 

$vl_crc:=$vl_crc ^| $vl_finalXor

  //### Setting Execution Control ON- Bruno LEGAY 2020.01.28
  //%R+
  //###

SET BLOB SIZE($vx_lookup;0)

End if
//$0:=$vl_crc
$0:=String($vl_crc;“000”)

</code 4D>

Hi,

: Javier CARNEROS COSGAYA

Nice idea to use a blob instead of an array.
:mrgreen:
A blob is an array of bytes, and it is adresses from 0 to size-1. So in this case, it was a perfect match…

:idea: If you run interpreted code, you can put this code in a compiled component to get speed :sunglasses:

: Bruno LEGAY

A blob is an array of bytes, and it is adresses from 0 to size-1. So
in this case, it was a perfect match…

That is true and I like it more.

: Bruno LEGAY

If you run interpreted code, you can put this code in a compiled
component to get speed

Good idea, I think I will do it in my company’s application, we run interpreted code, it is slower but we can made quickly modifications, and we are not in a harry. :wink:

Best.

Esto es parecido al SAFT que tienen en Portugal.

Sobre las Facturas en general ya existe la Factura Electrónica que es necesario homologarla al formato Europeo, veo dificil que se implante este formato, pero nunca se sabe.

Está pensado para los que no hacen facturas electrónicas y el control del pequeño comercio.
Lo miraré y a ver si entre todos podemos ayudar.

¿Cómo has resuelto la Firma Digital del XML?

Esto es un tema que 4D tiene bastante olvidado.

:evil:

: Joan GRABULEDA I SITJA

¿Cómo has resuelto la Firma Digital del XML?

¿Que te hace pensar que lo he resuelto?

No sólo el XML, también el software tiene que ir firmado, según el PDF:

La firma de software se realizará sobre el instalable de la
aplicación (el archivo que se distribuye), pidiendo conformidad para
instalar el software de la empresa correspondiente. De la misma
forma, el archivo mediante el cual se arranca la aplicación
(ejecutable) también deberá ir firmado.

Me parece exagerado lo que están pidiendo, incluso guardar el histórico de las versiones de la aplicación, que podrían solicitarlas en cualquier momento.

Estoy muy preocupado con este tema.

Saludos.

Lo del XML lo he pedido varias veces a 4D y por ahora ni caso. Los
usuarios tienen que utilizar el programa del ministerio AutoFirma:

<https://administracionelectronica.gob.es/ctt/clienteafirma/descargas#.
GzFmUuomTM>

Pero en el caso del TicketBai se complica un poco.

He pedido información sobre cómo encaja la Facturación Electrónica y
si se utiliza un esquema compatible con la Unión Europea y no me han
respondido.

Sobre la firma de Software en principio no hay ningún problema. No sé
si utilizas Mac o Windows, pero las aplicaciones Mac tienen que ir
firmadas y notarizadas. Pero es necesario un Certificado Digital.

En Windows he estado indagando, se puede realizar desde el Terminal o
mediante un programa. He encontrado MassCert que es gratuíto. Ahora me
toca realizar algunas pruebas.

Una cosa que me tenia intrigado es la certificación del Instalador. Y
les he preguntado sobre los que distribuyen aplicaciones sin
instalador qué criterios es necesario seguir. Han contestado:

Entendemos que cada entorno tecnológico puede tener sus
peculiaridades en la forma de despliegue de las aplicaciones. Puede
haber tanto instalación física del software en un dispositivo (por
asistente de instalación, copia de archivos o el método que sea) o
acceso a una aplicación distribuida en un servidor o soluciones
mixtas.

TicketBAI exige que en el caso de que exista un despliegue o
instalación de software en un dispositivo, este software lleve una
firma de código. Siempre que el entorno tecnológico lo permita.

Llego a la conclusión que solamente quieren la Aplicación Firmada. Hay cosas que no las tienen muy claras.

Sobre el número de Serie del Dispositivo:

Se requiere identificar los datos “propios” y “unívocos” del
dispositivo. Para ello, se dará por válidos los datos de un
dispositivo a través del número de serie del equipo> wmic bios get
serialnumber, a través del número de serie de la placa base > Wmic
baseboard get serialnumber, o de la MAC de la tarjeta de red.

En los dispositivos móviles el dato unívoco del dispositivo será su
“IMEI “

Han lanzado un proyecto que tiene muchas cosas que están en el aire y puede ser modificado si los usuarios presionan un poco.

Seguiré investigando.

Gracias Joan por toda esta información.

Para el número de serie del dispositivo, de momento estoy
implementando el componente de Maurice INZIRILLO, que supongo ya has
visto:

<
http://forums.4d.com/Post/EN/3009539/1/3009540#27010159

: Joan GRABULEDA I SITJA

Han lanzado un proyecto que tiene muchas cosas que están en el aire y
puede ser modificado si los usuarios presionan un poco.

Y muy precipitado en cuanto a plazos; el pdf que he colgado está publicado como a mediados de Diciembre y la definición de los xml creo que hace poco más de una semana.

: www.gipuzkoa.eus

Asimismo, a lo largo de 2020 se irá publicando la normativa que
regula la nueva obligación del TBAI.

Y pretenden hacerlo funcionar a principios de 2021.
Estoy pensando en las balanzas que utilizan en carnicerias y pescaderías, por ejemplo, que emiten directamente el ticket, en las actualizaciones del software de los TPV, incluso de algunas impresoras de tickets que no puedan imprimir un QR. Va ha suponer un gasto importante para el pequeño comericio.

No tengo bola de cristal pero adivino problemas. :sunglasses:

Saludos.

Las administraciones toman decisiones que después no pueden aplicar.

Tenemos una Factura Electrónica que no se adapta al esquema europeo, los ayuntamientos y otras administraciones tiene que ser todo digital y lo poco que hay está lleno de fallos, etc, etc.

Han lanzado esta piedra y después poco a poco se implementará. Estas decisiones perjudican a los pequeños desarrolladores de Software y benefician a los grandes.

Les he preguntado si el formato XML se adapta a alguna normativa europea y aún no han contestado. Improvisación total y ganas de un control desmesurado, que seguramente no sabrán gestionar.

Seguro que habrá problemas y protestas pero serán flexibles con la norma. Muchas veces detrás de estas decisiones también hay intereses que van más allá de los recaudatorios.

:oops:

¡ Amén !

Sorry for my english…
I understood your are talking about xml and signature…

But if you are interested in signing xml document we have a component to use certificates to sign xml using xmldsig. The component uses php openssl and xml commands to handle the certificates and sign the document.

Contact me privately if you are interested.

I know this PHP script:

https://github.com/robrichards/xmlseclibs

But it doesn’t use XADES.

The commented component uses XADES?

:smiley:

Hola,

No, I did not have XADES. Our component was designed to send a xmldsig data as a SOAP request.

From what I understand, XADES is an extension to xmldsig.
Code :
https://www.w3.org/TR/XAdES/
.

I havent really looked into it in depth, but if you get stuck we could look into it.

Adjunto enlace con código de Firma PHP que utiliza Xades para firmar las facturas electrónicas.
Puede servir de gran ayuda.

A ver si somos capaces de utilizarlo con 4D.

Attached link with PHP Signature code that Xades uses to sign electronic invoices.
It can help a lot.

Let’s see if we are able to use it with 4D

https://github.com/josemmo/Facturae-PHP

:idea:

Y si querias más confusión la respuesta sobre la Factura Electrónica.
Ahora ya no sé si el XML del Facturae servirá en Euskadi o será
diferente o en la Unión Europea habrá un XML único.

Pienso que van muy perdidos y no tienen las ideas claras y si tienen
las ideas claras para temblar.

En primer lugar disculpas por el retraso en la contestación.
En el supuesto de factura electrónica también debe emplearse el
sistema TicketBAI. Como cuestión previa debe indicarse que con la
nueva definición de factura electrónica otorgada en la Directiva
2006/112/CE del Consejo, de 28 de noviembre de 2006, relativa al
sistema común del impuesto sobre el valor añadido, con las
modificaciones introducidas en la misma por la Directiva 2010/45/UE,
de 13 de julio de 2010, por la Directiva tendrá la calificación de
factura electrónica toda factura expedida y recibida en formato
electrónico.
En relación a la factura electrónica que sea exclusivamente un
archivo XML o EDI, es decir que pueda considerarse ilegible (como es
el caso de facturación a Administraciones Públicas) es previsible que
la normativa reglamentaria a la vista de la imposibilidad de insertar
una imagen ( código QR) exima exclusivamente de dicha obligación,
pero deberá en cualquier caso de modo obligatorio implantar el
sistema TicketBAI e incluir el código identificativo TBAI

Gracias Joan.

Lo que no entiendo es porqué publican esas fechas de implementación cuando aún no lo tienen bien definido.
Según he leido, el que lo tenga preparado en Junio o Julio (no recuerdo) se aplicará un 30% de descuento de la inversión realizada en la actualización del sistema. Inversión que los contribuyentes tenemos que realizar para facilitarles la labor recaudatoria. Simpáticos ellos ¿verdad?.

Tengo parado el tema de la firma del xml, no he podido atenderlo.