Er, Dificil :)

Alguém tem idéia como fazer isso em java?

http://br2.php.net/manual/en/function.pack.php

Na documentacao do Php diz que emula a funcao do perl (que nao programo) e que transforma em binario, ainda por cima usando aqueles filtros (lil/bin endian etc)…

Enfim, como teria o mesmo efeito que

pack("nvc*", 0x1234, 0x5678, 65, 66);

em Java?

No meio tempo vou pesquisando, qquer coisa posto aqui a solucao (se eu achar antes)

Abs

Sei programar em PHP e Java, mas nao manjo nada de ingreis, e vc me mandou pra uma página toda em ingles(Nao tenho paciencia para traduzir tudo).

Mas se vc quizer uma ajudamesmo assim, me manda o codigo em PHP que eu traduzo ele pro Java(Se eu conseguir :grin: )

óóó… q surpresa… uma função PHP com um nome estapafúrdio, uma documentação q não diz nada com nada, q sensação de ‘deja vu’ :mad:

afinal, qual o objetivo deste tal pack() ??? eh pra converter bases??? avaliar expressão regular??

é isso que vc quer fazer?

int decimal = leValor(); String binario = Integer.toBinaryString(decimal);

[quote=“microfilo”]é isso que vc quer fazer?

int decimal = leValor(); String binario = Integer.toBinaryString(decimal);[/quote]

Não, eu não preciso da representação binária do número em decimal (ou String sei la) e sim dos caracteres raw…
O que nos leva ao proximo comment…

Com um pouco de reflexao nas montanhas cheguei a conclusao que nao preciso de toda a funcionalidade e posso pular…
Realmente é ridiculo o nome e não explica nada no php.net…no meu conceito não existia “binário”, afinal, cada caractere tem um valor (0 a 255) e não tem nenhuma codificação além dessa, o level mais baixo é o byte…o que nos leva ao próximo comentário…

#1 = O php lixo.net tem a versao em portugues, é só trocar o /en/ por /pt-br/, é que a descricao mal feita em ingles fica ainda pior em portugues…
#2 = O que eu precisava emular era exatamente a função, ou seja:
pack(“C3”, 0x05, 0x01, 0x00);

Resumindo, o que o pack faz:

Tranformacoes no caractere/byte

Ou seja,
pack(“C3”, 0x05, 0x01, 0x00);

Significa que estou enviando 3 caracteres unsigned…
0x05 = ENQ (enquiry, ascii)
0x01 = SOH (start of heading, ascii)
0x00 = NUL (null, ascii)

Creio que os motivos que o cara que codificou assim em php (é um script pra um proxy 5 wrapper, o qual vou fazer em java pois preciso de implementar a opção de usar proxy no meu MTA), sejam:

#1: Não ter problema em relação ao charset do código fonte digitado (motivo de usar o 0x05 ao invés do caractere, além de serem caracteres não imprimíveis)
#2: Assegurar o formato do dado em todas as plataformas para se manter na especificação do proxy (ou seja, unsigned char, 3 deles —por issso o C3…C2 = seriam 2…ou CC…etc)…

A função pack em si dá algumas opcoes mais obscuras que nem são possiveis em java (byte signed ou unsigned por exemplo, precisa de emular fazendo uma função e mantendo em char para não perder o dado…acho que (byte b = c < 0 ? c * -1 + 127 : c) ou algo assim…
Todas são emuláveis, o problema é que dá trabalho e tambem saber o que cada uma faz (tipo null padded string…what the fuck is that hehehe)

Enfim, é isso…

Como é apenas o signed char usado, não tem problema de compatibilidade e não preciso de emular a função…

Quando (e se) eu terminar o proxy wrapper eu aviso e posto o código aqui :slight_smile:
Valeu

agora ficou mais claro!!!

experimente usar a função da Classe java.lang.String byte[] getBytes(String encoding)

byte&#91;&#93; cSeq = &quot;C3&quot;.getBytes&#40;&quot;ISO-8859-1&quot;&#41;;

espero ter ajudado um pouco

[quote=“viecili”]agora ficou mais claro!!!

experimente usar a função da Classe java.lang.String byte[] getBytes(String encoding)

byte&#91;&#93; cSeq = &quot;C3&quot;.getBytes&#40;&quot;ISO-8859-1&quot;&#41;;

espero ter ajudado um pouco[/quote]

não é bem isso :slight_smile:

C3 significa CCC ou seja

Unsigned char
Unsigned char
Unsigned char

O charset só entra no “jogo” pelo byte que precisa ser enviado, mas isso é facilmente “burlado” usando por exemplo o código unicode direto (acho que em java é só por u na frente né? tipo u012)…

E ainda assim é só o começo, por que cada letra do filtro quer dizer uma coisa, pode querer dizer “formate em big endian” ou em little, ou signed ou nao signed etc…ou até uma combinacao de varios…

Mas como disse, no meu caso especifico só precisava que fosse unsigned char, olhando melhor a função no php e o uso dela no código vi que não preciso reproduzir ela já que o único uso é em Unsigned char…que posso transformar com uma continha simples…

Java = signed char, unsigned byte
Funcao que preciso = unsigned…

Resumindo é só eu usar byte e escrever o byte diretamente na conexão…
write(byte [] b, int offset, int len) em BufferedOutputStream, se bem me lembro…

Enfim, valeu