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

converter de BCD para texto

Mensagempor fyngr » Segunda Jun 04, 2007 12:24

boas,

preciso de fazer um programa que converta dados BCD para texto, alguem sabe como fazer ou tem algo parecido?

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

Mensagempor zoltrix » Segunda Jun 04, 2007 14:16

Fazes download de uma tabela ASCII verificas o equivalente de cada letra e número em BCD.
Bastam 7 bits para definir todos os caracteres, o oitavo mais significativo pode servir para marcar os numeros em quantidade negativa.

http://pt.wikipedia.org/wiki/ASCII

Se leres 8 bits de cada vez tens o teu texto.
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 » Segunda Jun 04, 2007 14:24

mas isso teria de ter números certo ?
onde ia ver a tabela o que correspondia esse grupo de numero e dava uma letra né?

eu tenho qualquer coisa deste tipo:
 •ULT.DIESEL   

é o que lá esta na realidade é isto:
1| 9.5|ULT.DIESEL| 1| 3| 0.0| 0.00| 0|


desta forma, tens alguma sugestao?

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

Mensagempor zoltrix » Segunda Jun 04, 2007 14:32

Tu não vês o binário o pc é que o vê, por isso lês os 8 bits fazes a descodificação para o valor decimal correspondente e imprimes esse valor como texto.

O que mostraste no inicio foi o ficheiro lido com um programa que não o criou e logo não sabe qual o tamanho da string a ler, sabes qual é o soft utilizado para criar esse texto?
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 » Segunda Jun 04, 2007 15:16

entao é assim, eu tenho um programa que vai buscar aquela informação em BCD, e depois tenho outro que supostamente converte para texto, mas fica-lhe a faltar informação as vezes, nao é mt fiavel.

mas da para ver sem ser em espacos e caracteres mais estranhos a informação nao é?

cumps e desde já obrigado
Avatar do Utilizador
fyngr
Membro de Prata
Membro de Prata
 
Mensagens: 135
Registado: Segunda Out 03, 2005 16:31

Mensagempor fyngr » Terça Jun 05, 2007 9:22

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

Mensagempor zoltrix » Terça Jun 05, 2007 10:18

Olá.
Estive a rever o que tinha dado já há muito tempo sobre ficheiros binários e podes ter aí um problema para tentares descortinar o que tens no ficheiro.
Porque uma só linha de código binário pode conter vários tipos de dados o que não te dá para simplesmente ler X bits e converter, se não souberes exactamente o tamanho que deves ler em cada iteração não vais conseguir ler o que pretendes, mas podes tentar adivinhar com base no que esperas lá ter.

No exemplo que me deste a primeira aproximação que faria seria tentar transformar a string para tipos possiveis:

1| 9.5|ULT.DIESEL| 1| 3| 0.0| 0.00| 0|

int char float/double char char[] char int char int char float/double char float/double char int char

E agora aqui só com tentativas e que lá chegas porque o int pode ter 2Bytes ou 4 Bytes dependendo como é definido (short, long, unsigned), o float tem 4Bytes e o double 8Bytes e depois tens a string que não sabes o tamanho(eu diria 10 á primeira vista) e ainda falta saber como é tratado o espaço a seguir ao |.
Não consegues falar com ninguem que tenha maneira de te dizer como são produzidos os ficheiros?
Boa sorte.
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 Kayn » Terça Jun 05, 2007 11:26

que confusao...
algumas perguntas de diagnostico:

Em que linguagem queres programar?

O que é que entra no programa pra ser convertido em texto? strings de 8bit ja formatados em BCD?

Tens que ter certeza de coisas pra fazer um sistema fiavel.
Para BCD comportar letras, deves ter conjuntos de 8bit por caracter.
Em que formato te devolve o teu programa que vai buscar o BCD? (BCD tem standarts mas nao sao enforced, por isso qualquer formato vale)

Devolve strings de 8bit BCD compativeis com ASCII? É provavel, e se for o caso, depois so tens que escrever um programa que pegue no codigo BCD que o outro programa devolveu, analise e compare em grupos de 8bit com uma tabela ASCII e te devolva a letra/numero/caracter correspondente na tabela. É uma coisa simples de se fazer.

Mesmo que nao seja compativel com ascii, o processo pode ser o mesmo. Desde que arranjes/faças a tabela conversora correcta, o programa é genérico.
Imagem
Imagem
Kayn
Gurus
Gurus
 
Mensagens: 3038
Registado: Quarta Ago 04, 2004 3:34

Mensagempor fyngr » Terça Jun 05, 2007 12:37

estou a programar com vb.net 2005.
a tabela está estrutrada da seguinte forma:
aqui
o que tive agora a fazer foi converter aqueles caracteres para ascii!
agora preciso de pegar no que me deu em ascii e intrepreta-lo com o BCD nao é?
deu-me algo deste tipo:
1 32 32 21 69 77 46 82 65 67 73 78 71 52 84 5 2 32 32 32 32 32 32 86 1 66 48 52 101
isto em relacao a este registo:
1| 154.5|M.RACING4T| 6| 3| 0.0| 0.00|560142303460|
( EM.RACING4T VB04e))

agora tenho de pegar no 32 32 21 69 e ver o que quer dizer isto em BCD, certo?
isto ainda nao ta mt claro para mim :?
Avatar do Utilizador
fyngr
Membro de Prata
Membro de Prata
 
Mensagens: 135
Registado: Segunda Out 03, 2005 16:31

Mensagempor Kayn » Terça Jun 05, 2007 14:08

essa tabela é o descritivo das coisas todas que queres converter para texto, certo?

é que, a ser assim, já pode ser um bocado diferente. Vais ter que analisar separadamente, cada objecto a converter. Como o vais fazer, depende da fonte (ficheiro de texto organizado, etc)

Sugiro que dividas o teu programa em partes.

1ª parte que identifique o formato dos dados (se é um binary, se é BCD ou ASCII) e reencaminhe para o proxima parte do programa correspondente.
Provavelmente podes fazer isto atraves do "Length" que deve estar em bytes: o primeiro 1 byte da tua cadeia de informação é o Article Type, os proximos 4 sao o Price, etc.

2ª parte subdividida em 3 que vai trabalhar a informação e converte-la para texto. Nao convertes um binário para numero decimal da mesma maneira que um ASCII ou um BCD, daí a necessidade das 3 "secções".


Eu fazia uma coisa deste genero: tens 8 tipo de dados, por isso eu criava 8 variaveis e um ciclo que fosse colocando em cada uma os varios dados.
Sabes o formato em que está codificada a informação em cada variavel, por isso era só processa-la de acordo com o que ela é.

No caso do BCD, nao queres transforma-lo em letras, queres transforma-lo em numeros (so tens objectos packed BCD unsigned para variaveis numericas), e assim ja é diferente.
É so procurares um bocadinho sobre como transformar o teus bytes BCD em numeros decimais com duas casas decimais, nao é dificil.

No caso do ASCII, se calhar o melhor é arranjares uma tabela com o codigo ASCII e o respectivo caracter correspondente (num ficheiro de texto ou assim). Depois poes o programa a comparar byte a byte (cada byte é um caracter/letra/numero, dos 10) com os codigos da tabela e fazer sair o caracter que corresponde ao codigo. Se estiver a funcionar, deves conseguir fazer sair o texto correctamente. Com algum azar, podes ter que criar tu a tua tabela ascii num formato que o teu programa consiga ler. Nao é dificil, só que pode ser um tédio :P Tambem podes programar a tabela ascii logo directo no codigo, mas é tudo menos uma soluçao elegante. Gosto muito mais da tabela, pralem de que torna o teu programa mais genérico, o que é bom.

No caso dos binarios, é uma conversao de codigo binario pra decimal simples.

Vai dando noticias sobre o progresso da coisa.
Imagem
Imagem
Kayn
Gurus
Gurus
 
Mensagens: 3038
Registado: Quarta Ago 04, 2004 3:34

Mensagempor fyngr » Terça Jun 05, 2007 15:32

sim, é a estrutura da tabela que quero converter!

depende da fonte?!

tou a entender a tua ideia, era isso que mais ou menos tava a fazer, o problema, é que por exemplo: este o ficheiro em que está a informaçao: aqui
estou a programar em vb.net 2005
e utilizando o StreamReader ou o StreamBinaryReader está a intrepretar aqueles espaços como <b>0</b>.
o que está errado porque logo no primeiro registo o price é 9.5...
agrupando a primeira linha do index 1 ao 4 dá-me 0000 o que deve ser 0.
Avatar do Utilizador
fyngr
Membro de Prata
Membro de Prata
 
Mensagens: 135
Registado: Segunda Out 03, 2005 16:31

Mensagempor Kayn » Quarta Jun 06, 2007 2:32

o tua fonte é muito má. Nao consegues limpar um bocadinho esse ficheiro de texto?

Isso parece uma coisa ou mal convertida entre formatos ou entao um ficheiro com uma formatacao especial que esta a ser aberta pelo notepad que le tudo.

Se abrires isso com o word ou assim, nao fica melhor? se ficar, podes grava-lo em txt no proprio word que ele deve-se encarregar de limpar e deixar só o que interessa.
Imagem
Imagem
Kayn
Gurus
Gurus
 
Mensagens: 3038
Registado: Quarta Ago 04, 2004 3:34

Mensagempor fyngr » Quarta Jun 06, 2007 8:59

pois, agora a minha duvida é se aquilo são mesmo espaços ou se é apenas o notepad a tentar converter pa ASCII e mostra assim...
ja tive a ler com o streamreader e com o binaryreader, mas é a mesma coisa, le sempre como espaço :?

abrindo com o word ve-se pior e gravando fica a mesma coisa...

será que o vb.net tem alguma ferramenta para ler estes ficheiros?
Avatar do Utilizador
fyngr
Membro de Prata
Membro de Prata
 
Mensagens: 135
Registado: Segunda Out 03, 2005 16:31

Mensagempor zoltrix » Quarta Jun 06, 2007 10:06

O ficheiro é uma exportação de algum software POS não é?, e deve ser de alguma estação de abastecimento ou coisa assim.

Se pudesses facultar o ficheiro ou parte dele penso que ajudava, mas tem de estar original sem nunca ter sido aberto por algum programa e guardado através desse programa.

Já agora a conversão de BCD é mais porreira que o binário já que cada digito é convertido em binário directamente e não como um todo, embora que só é bom para nós humanos para ler directamente o valor e não ter de fazer cálculos para determinar o que lá está, mas para programar dá mais um bocadinho de trabalho.
Ex. 531 - 0101 0011 0001
Editado pela última vez por zoltrix em Quarta Jun 06, 2007 10:20, num total de 1 vez.
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 10:17

sim, é a base de dados de um software de um POS, duma bomba de combustivel.

posso enviar parte do ficheiro, achas que o facto de ter sido aberto com o notepad iria 'estragar' os dados?
penso que o que o notepad está a fazer é a intrepretar como ASCII e entao faz aquelas coisas, o dados do ficheiro nao devem 'estragar-se' se for só visualizado, sem nunca ser gravado.

de que forma estás a pensar fazer?
Avatar do Utilizador
fyngr
Membro de Prata
Membro de Prata
 
Mensagens: 135
Registado: Segunda Out 03, 2005 16:31

Próximo

Voltar para Programação

Quem está ligado:

Utilizadores a ver este Fórum: Nenhum utilizador registado e 3 visitantes

cron