converter de BCD para texto

PHP, Java, JavaScript, XML, XHTML, HTML, CSS, ASP, Delphi, Assembly, LaTeX, C, UML, Flash, Perl, SQL, Python, Zope, Pascal, WML. Se conhece mais de 3 siglas referidas, este é o forum para si.

Moderadores: Administradores, Moderadores

Mensagempor zoltrix » Quarta Jun 06, 2007 10:46

Ele está a interpretar tudo como ASCII por isso é que podes visualizar o nome da artigo que de facto é o único ASCII no ficheiro.

Os dados em binary tal como o Article Type, Product Group, Tax Class devem estar codificados em unsigned int's talvez devido ao intervalo 0-xx?

O ASCII está guardado como valores numéricos que podem ser convertidos directamente para texto.

No caso do BCD unsigned do Price o tamanho é de 6 pelo que só para este tens 24bits/3Bytes.

Posso estar a complicar mas acho que o que tens de fazer é ler X bytes correspondentes a cada um dos tipos e dependente do tamanho definido pela tabela.gif e depois descodificar o que lá está e imprimir para um ficheiro de texto.
Mas mesmo assim acho que ainda faltará o '|', estará incluido no ficheiro binário?
Se estiver incluido pode servir como 'flag' para se fazer o parser do ficheiro, como se faz em FLEX, lia até encontrar um '|' e guardava esses bytes depois lia até ao próximo, etc...
LG E300
zoltrix
Membro de Prata
Membro de Prata
 
Mensagens: 191
Registado: Segunda Abr 11, 2005 8:53
Localização: 127.0.0.1

Mensagempor fyngr » Quarta Jun 06, 2007 11:09

sim, como o nome é o unica coisa da tabela que está em ASCII o notepad intrepreta certo.

nao entendi, ao intervalo 0-xx?

sim, foi isso q tentei fazer, o problema é que em vez de me dar dados correctos, da-me 0, isto da forma que fiz, nao sei se está correcta.
o '|' nao deve estar no ficheiro original, isso é dum executavel que tenho que faz a conversão quase-certa, pois no EAN-13 code (ultimo campo) falta-lhe um número e nem sempre converte tudo, por isso nao ligues a '|'.

o correcto, é ler o primeiro caracter, é o Article Type, do segundo ao quinto é o Price, etc, etc...
o problema é nao conseguir ler correctamente os dados!
Avatar do Utilizador
fyngr
Membro de Prata
Membro de Prata
 
Mensagens: 135
Registado: Segunda Out 03, 2005 16:31

Mensagempor fyngr » Sexta Jun 08, 2007 14:13

zoltrix, conseguiste obter alguns resultados?
Avatar do Utilizador
fyngr
Membro de Prata
Membro de Prata
 
Mensagens: 135
Registado: Segunda Out 03, 2005 16:31

Mensagempor fyngr » Terça Jun 19, 2007 13:35

tá aqui o código para converter de BCD para texto, se alguem precisar.

Dim HighDigit, LowDigit As Char
Dim BCDbyte(87000) As Byte
Dim x As Integer
Dim r As Integer = 0
Dim ArtType, Price, ArtName, ProdGroup, TaxClass, DiscAmou, DiscPerc, EAN13 As String
If ofdFile.ShowDialog() = Windows.Forms.DialogResult.OK Then
If File.Exists(ofdFile.FileName) = True Then
cn.ConnectionString = "Server=" & Servidor & ";uid=" & User & ";pwd=" & pwd & ";database=" & bd
cn.Open()
cm.Connection = cn
Dim ins As String
pbPOS.Value = 0

BCDbyte = My.Computer.FileSystem.ReadAllBytes(ofdFile.FileName)
For i As Integer = 0 To BCDbyte.Length - 1 Step 29
x = i
r = r + 1
For y As Integer = 0 To 28
Select Case y
Case 0 : ArtType &= CStr(BCDbyte(x))
Case 1, 2, 3, 4
HighDigit = Chr((BCDbyte(x) >> 4) + 48 )
LowDigit = Chr((BCDbyte(x) And 15) + 48 )
If y = 4 Then
Price &= CStr("." & HighDigit & LowDigit)
Else
Price &= CStr(HighDigit & LowDigit)
End If
Case 5, 6, 7, 8, 9, 10, 11, 12, 13, 14
ArtName &= CStr(Chr(BCDbyte(x)))
Case 15 : ProdGroup &= CStr(BCDbyte(x) + 1)
Case 16 : TaxClass &= CStr(BCDbyte(x) + 1)
Case 17, 18, 19, 20
HighDigit = Chr((BCDbyte(x) >> 4) + 48 )
LowDigit = Chr((BCDbyte(x) And 15) + 48 )
DiscAmou &= CStr(HighDigit & LowDigit)
Case 21, 22
HighDigit = Chr((BCDbyte(x) >> 4) + 48 )
LowDigit = Chr((BCDbyte(x) And 15) + 48 )
DiscPerc &= CStr(HighDigit & LowDigit)
Case 23, 24, 25, 26, 27, 28
HighDigit = Chr((BCDbyte(x) >> 4) + 48 )
LowDigit = Chr((BCDbyte(x) And 15) + 48 )
EAN13 &= CStr(HighDigit & LowDigit)
If r = 28 Then
If r <> CInt(EAN13) Then
Dim First, Sec As String
Dim FirstAux, SecAux As Integer
Dim Res As Integer
For p As Integer = 0 To 11
Select Case p
Case 0 : First = EAN13([p])
FirstAux = CInt(First)
Case 1 : Sec = EAN13([p])
SecAux = CInt(Sec)
Case 2 : First = EAN13([p])
FirstAux = CInt(First) + FirstAux
Case 3 : Sec &= EAN13([p])
SecAux = CInt(Sec) + SecAux
Case 4 : First &= EAN13([p])
FirstAux = CInt(First) + FirstAux
Case 5 : Sec &= EAN13([p])
SecAux = CInt(Sec) + SecAux
Case 6 : First &= EAN13([p])
FirstAux = CInt(First) + FirstAux
Case 7 : Sec &= EAN13([p])
SecAux = CInt(Sec) + SecAux
Case 8 : First &= EAN13([p])
FirstAux = CInt(First) + FirstAux
Case 9 : Sec &= EAN13([p])
SecAux = CInt(Sec) + SecAux
Case 10
First &= EAN13([p])
FirstAux = CInt(First) + FirstAux
Case 11
Sec &= EAN13([p])
SecAux = (CInt(Sec) + SecAux) * 3
Res = FirstAux + SecAux
If (Res Mod 10 = 0) Then
EAN13 &= "0"
Else
For o As Integer = 1 To 9
If ((Res + o) Mod 10) = 0 Then
EAN13 &= ((Res + o) - Res)
Exit For
End If
Next
End If
End Select
Sec = ""
First = ""
Next
Sec = ""
First = ""
SecAux = 0
FirstAux = 0
End If
End If
End Select
x = x + 1
Next
ins = "INSERT INTO ARTIGO (Id_Artigo, Preco, Descricao, Id_Grupo, Id_Iva, CodigoBarras, Id_UnidadeMedida, Id_SubGrupo) VALUES (" & CInt(r) & ",'" & Price & "','" & Replace(ArtName, "'", "") & "'," & CInt(ProdGroup) & "," & CInt(TaxClass) & ",'" & EAN13 & "',1,1)"
cm.CommandText = ins
cm.ExecuteNonQuery()
pbPOS.Value = r
'ListBox1.Items.Add(ArtType & "|" & Price & "|" & ArtName & "|" & ProdGroup & "|" & TaxClass & "|" & DiscAmou & "|" & DiscPerc & "|" & EAN13)
ArtType = ""
Price = ""
ArtName = ""
ProdGroup = ""
TaxClass = ""
DiscAmou = ""
DiscPerc = ""
EAN13 = ""
Next
End If
End If

MessageBox.Show("Dados importados com sucesso.", "ConverterIT", MessageBoxButtons.OK, MessageBoxIcon.Information)


cumps
Avatar do Utilizador
fyngr
Membro de Prata
Membro de Prata
 
Mensagens: 135
Registado: Segunda Out 03, 2005 16:31

Anterior

Voltar para Programação

Quem está ligado:

Utilizador a ver este Fórum: Nenhum utilizador registado e 1 visitante

cron