Italian Convertire ean 128 in una mappa [Risolto] Grazie sirjo66

sirjo66

Well-Known Member
Licensed User
Longtime User
scusa ho sbagliato immagine
barcode.gif


ho bisogno che provi a leggere questo codice con il tuo programma android, e dirmi cosa ricavi come stringa
ovviamente le parentesi tonde non le leggi, non ci sono nel codice, ma dovrebbe esserci un carattere FNC1 (cioè un 29 decimale)
 

Sagenut

Expert
Licensed User
Longtime User
Io temo che otterrà esattamente quella stringa senza le parentesi perchè i codici se li interpreta il lettore.
Ed è questo che ci sega tutto. ;)
 

Sagenut

Expert
Licensed User
Longtime User
Come aveva scritto @drgottjr bisognerebbe usare un lettore di barcode che magari ci passa la stringa completa di tutto, e da lì fare l'analisi.
 

Xfood

Expert
Licensed User
scusa ho sbagliato immagine
View attachment 145690

ho bisogno che provi a leggere questo codice con il tuo programma android, e dirmi cosa ricavi come stringa
ovviamente le parentesi tonde non le leggi, non ci sono nel codice, ma dovrebbe esserci un carattere FNC1 (cioè un 29 decimale)
non riesco a leggerlo
 

drgottjr

Expert
Licensed User
Longtime User
magari no - e' certo. utilizzo ocr e barcode nella stessa app. nel caso in cui.
alora, non c'e' alcuna graranzia nemmeno con ocr (quindi sempre esiste
la possibilita di errore), ma gia sappiamo che con barcode non e' possibile
leggere parentesi che non esitono nel codice. e necessario avere un lettore
di codice che riconosce i simboli non stampabili E che li include
nel codice. non ne avremmo bisogno di parentsei se avessimo questi simboli.
 

Xfood

Expert
Licensed User
sto provando a settare il lettore per vedere se riesco a leggerlo
 

Xfood

Expert
Licensed User
ho settato il lettore, adesso lo leggo, l'ho dovuto stampare su carta
ecco cosa leggo:
01012345678901281012345678921987654321
1694281717569.png
 

Xfood

Expert
Licensed User
ecco testo letto:
01012345678901281012345678921987654321

testo con ricerca del carattere asc(29)
010123456789012810123456789[func1]21987654321

testo trasformato in asc
484948495051525354555657484950564948495051525354555657-5049575655545352515049
1694282100302.png


allego progettino di esempio
 

Attachments

  • ean128_test.zip
    10.3 KB · Views: 61

Xfood

Expert
Licensed User
leggendo il mio dall'etichetta originale del fornitore
1694282542670.png


la lettura non trova nessun asc(29)
1694282580064.png


questo quello che ritorna
01980081105541283103009140172309201002743989

anche sul controllo del carattere e sempre cosi:
01980081105541283103009140172309201002743989

e cosi trasformato in asc
4849575648485649494853535249505651494851484857495248495550514857504849484850555251575657

leggo il dato con lo scanner e popolo una edittext1
e poi faccio un controllo da codice come suggerito @BlueVision per rendere visibile il carattere asc(29)

B4X:
Private Sub Button1_Click
    Dim TXTRESULT As String =""
    Dim testo As String =""
    Dim lettura As String =EditText1.text.Trim
    Log(EditText1.Text.Trim)
    
    
    For a = 1 To lettura.Length
        Log("a: " & a)
        
        If Asc(Mid(lettura,a,1)) <> 29 Then
            Log(Asc(Mid(lettura,a,1)))
            TXTRESULT = TXTRESULT & Asc(Mid(lettura,a,1))
            testo=testo & Mid(lettura,a,1)
        Else
            Log(Asc(Mid(lettura,a,1)))
            TXTRESULT = TXTRESULT & "-"
            testo=testo & "[func1]"
        End If
    Next
    
    EditText2.Text=TXTRESULT
    Log(EditText1.Text.Trim)
    Log(testo)
    Log(TXTRESULT)
End Sub

Sub Mid(Text As String, Start As Int, Length As Int) As String
    Return Text.SubString2(Start-1,Start+Length-1)
End Sub
 

Xfood

Expert
Licensed User
ecco cosa leggo
01012345678901281012345678921987654321

verifica codice il codice fnc1 in effetti lo legge asc(29)
010123456789012810123456789[func1]21987654321

asc codice
484948495051525354555657484950564948495051525354555657-5049575655545352515049



grazie...
 

sirjo66

Well-Known Member
Licensed User
Longtime User
B4X:
Sub Globals
    Dim decoders As Map
    Dim FNC1 As String = Chr(29) ' se vuoi puoi cambiare Chr(29) con "-"
End Sub

Sub Activity_Create(FirstTime As Boolean) 'ignore
  
    ' creo mappa dei decoders
    decoders.Initialize
    ' Lnn = fixed length, nn digits
    ' Fnn = float, nn digit
    ' Vnn = variable, nn max length
    ' D6 = date
    ' https://it.wikipedia.org/wiki/GS1-128
    decoders.Put("00","L18")
    decoders.Put("01", "L14")
    decoders.Put("02", "L14")
    decoders.Put("10", "V20")
    decoders.Put("11", "D6")
    decoders.Put("12", "D6")
    decoders.Put("13", "D6")
    decoders.Put("15", "D6")
    decoders.Put("17", "D6")
    decoders.Put("20", "L2")
    decoders.Put("21", "V20")
    decoders.Put("22", "V29")
    ' ....... qui lascio a te aggiungere tutti gli altri che ti servono
    decoders.Put("30", "V8")
    ' da 310 a 369 sono tutti Float, non serve definirli
    ' da 390 a 394 sono tutti Float variabili, non serve definirli

    '....
    '....
  
    decoders.Put("415", "L13")
    decoders.Put("416", "L13")
    decoders.Put("8020", "V25")
  
    ' eccetera eccetera, devi aggiungere tutti quelli che ti servono

    ' --------------------------------------------------------------------
      
    ' test di decodifica
  
    Dim mappa As Map = Decodifica("010123456789012810123456789" & FNC1 & "21987654321")
    Log(mappa)
    Dim mappa As Map = Decodifica("01980081105541283103009140172309201002743989")
    Log(mappa)
    Dim mappa As Map = Decodifica("41580320890098748020123456789123456789392205799")
    Log(mappa)
    Dim mappa As Map = Decodifica("01080320890000173103002584392200646")
    Log(mappa)
    Dim mappa As Map = Decodifica("01080320890000173103002584392200646" & FNC1 & "393200314")
    Log(mappa)

    ExitApplication
  
End Sub

Sub Decodifica(codice As String) As Map
  
    ' F = fix
    ' D = decimal
    ' V = variable
    ' D = date
  
    Dim mappa As Map
    mappa.Initialize
  
    Do While codice <> ""
      
        If codice.StartsWith(FNC1) Then
            codice = codice.SubString(1)
            If codice = "" Then Exit
        End If
      
        ' ----------------------------------------------------------------------------------------
        ' per primo cerco i codici a due cifre
        Dim cod As String = codice.SubString2(0, 2)

        Dim decoder As String = decoders.Get(cod)
        If decoder = "null" Then
            cod = codice.SubString2(0, 3) ' ora cerco quelli a 3 cifre
          
            decoder = decoders.Get(cod)
          
            If decoder = "null" Then
                Dim codInt As Int = cod
                If codInt >= 310 And codInt <= 369 Then ' prima di tutto controllo che non siano i valore Float
                    decoder = "F6"
                End If
              
                If codInt >= 390 And codInt <= 394 Then ' controllo che non sia un Float Variabile
                    decoder = "F0" ' float a lunghezza variabile
                End If

                If decoder = "null" Then
                    ' provo con quelli a 4 cifre
                    cod = codice.SubString2(0, 4)
                    decoder = decoders.Get(cod)
                    If decoder = "null" Then
                        Msgbox("Codice AI " & cod & " non riconosciuto", "ERRORE") 'ignore
                        Return Null
                    End If
                End If
            End If
        End If
      
        Dim len As Int = decoder.SubString(1)
        Select decoder.SubString2(0, 1) ' estraggo il tipo (L, F, D, V)
            Case "L" ' lunghezza fissa
                mappa.Put(cod, codice.SubString2(cod.Length, cod.Length + len))
                codice = codice.SubString(cod.Length + len)
                Continue
              
            Case "F" ' float
                Dim decimali As Int = codice.SubString2(cod.Length, cod.Length + 1)
                Dim valore As String
                If len = 0 Then ' lunghezza variabile
                    Dim vn As String = codice.SubString(cod.Length + 1).IndexOf(FNC1)
                    If vn = -1 Then
                        valore = codice.SubString(cod.Length + 1)                       
                        len = valore.Length
                    Else
                        valore = codice.SubString2(cod.Length + 1, cod.Length + 1 + vn)
                        len = codice.SubString2(cod.Length, cod.Length + vn).Length + 1
                    End If
                Else
                    ' lunghezza fissa
                    valore = codice.SubString2(cod.Length + 1, cod.Length + 1 + len)
                End If
                Dim intero As String = valore.SubString2(0, valore.Length - decimali)
                Dim frazione As String = valore.SubString(intero.Length)
              
                Dim valoreFloat As Float = intero & "." & frazione
                mappa.Put(cod, valoreFloat)

                codice = codice.SubString(cod.Length + 1 + len)
                Continue
                  
            Case "D" ' data ddMMyy
                DateTime.DateFormat = "ddMMyy"
                Dim data As String = codice.SubString2(cod.Length, cod.Length + len)
                Dim dataLong As Long = DateTime.DateParse(data)
                mappa.Put(cod, dataLong)
                codice = codice.SubString(cod.Length + len)
                Continue
              
            Case "V" ' variabile
                Dim vn As String = codice.SubString(cod.Length).IndexOf(FNC1)
                If vn = -1 Then
                    mappa.Put(cod, codice.SubString(cod.Length))
                    codice = ""
                Else
                    mappa.Put(cod, codice.SubString2(cod.Length, cod.Length + vn))
                    codice = codice.SubString(cod.Length + vn + 1)
                End If
                Continue

        End Select
          
    Loop
  
    Return mappa
  
End Sub
 
Last edited:

Xfood

Expert
Licensed User
sembra che ci siamo,
ma per i valori variabili?

ho letto questo codice
422380423380424380425380 humancode: (422)380(423)380(424)380(425)380
e mi ritorna questa mappa
(MyMap) {422=380423380, 424=380425380}


ho aggiunto questi tag
decoders.Put("422", "V3") 'Paese di Origine nato
decoders.Put("423", "V15") 'Paese di sezionato
decoders.Put("424", "V3") 'Paese di Allevato
decoders.Put("425", "V15") 'Paese di Macellato
decoders.Put("426", "V3") ' Paese da capire meglio
decoders.Put("427", "V3") ' Paese da capire meglio
1694290640268.png


variabile da 3-15 come devo impostarlo?
 

sirjo66

Well-Known Member
Licensed User
Longtime User
422380423380424380425380 humancode: (422)380(423)380(424)380(425)380
e mi ritorna questa mappa
(MyMap) {422=380423380, 424=380425380}

sul 422380423380424380425380 che hai letto devi dirmi anche dove hai i codici FNC1
secondo la logica dovresti avere un FNC1 prima del (423), un altro prima del (424) e uno prima del (425)
 

Xfood

Expert
Licensed User
con la funzione di verifica codice ne trova solo uno
422380423380[func1]424380425380
 

Xfood

Expert
Licensed User
Sto leggendo questi codici:
11150613422380423380424380425380 HumanCode: (11)150613(422)380(423)380(424)380(425)380
(MyMap) {11=1371254400000, 422=380423380424380425380}



70061506147030380999x7031380999x humancode: (7006)150614(7030)380999x(7031)380999x
(MyMap) {7006=1402790400000, 7030=380999x7031380999x}
 
Top