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)…
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
Valeu
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…