Boa Tarde!!!
Como faço pra abrir um arquivo usando uma tabela ANSI criada por min???
abrir um arquivo eu sei, mas alterar a tabela de caracteres não!!!
Isso.:
conversão de caracteres OEM / ANSI com minha tabela
Ex.:
01=A
2F=B
FF=C
…
Crie um “FilterInputStream” que faça essa conversão para você.
Você pode criar seu próprio CharSet se quiser, mas isso é bastante complexo pelo que parece (veja a documentação de java.nio.charset.spi.CharsetProvider )
hummm, procurei no google sobre esse FilterInputStream, mas só achei filtro pra som, vc poderia dar um exemplo.!?, e quanto a criar meu chatset, tava dando uma olhada na src do java, mas ainda existem coisas que não consigo entender(sou iniciante), de qualquer forma Muito obrigado!!!
Leia o seguinte código (que não testei ) e veja se consegue entender como é que se cria uma FilterInputStream.
import java.io.*;
class MinhaFilterInputStream extends FilterInputStream {
/**
* Tabela de conversão
* Exemplo: dePara[0x01] -> (byte) 'A', dePara[0x2F] -> (byte) 'B', dePara[0xFF] -> (byte) 'C'
*/
private byte[] dePara;
public MinhaFilterInputStream (InputStream in, byte[] dePara) {
super (in);
this.dePara = dePara;
}
// Precisamos redefinir "read" para efetuar a conversão dos bytes.
// Como há 3 versões de read, precisamos redefinir as 3.
public int read() throws IOException {
int byt = super.read();
byt = dePara [byt] & 0xFF;
return byt;
}
public int read(byte[] pB, int pOff, int pLen) throws IOException {
int nBytes = super.read(pB, pOff, pLen);
for (int i = pOff; i < pOff + nBytes; ++i) {
pB [i] = dePara [pB[i] & 0xFF];
}
return nBytes;
}
public int read(byte[] pB) throws IOException {
int nBytes = super.read(pB);
for (int i = 0; i < nBytes; ++i) {
pB [i] = dePara [pB[i] & 0xFF];
}
return nBytes;
}
}
class TesteFilterInputStream {
public static void main(String[] args) throws IOException {
/**
* Tabela de conversão
* Exemplo: dePara[0x01] -> (byte) 'A', dePara[0x2F] -> (byte) 'B', dePara[0xFF] -> (byte) 'C'
*/
byte[] dePara = {
(byte) 0, // 0x00
(byte) 'A', // 0x01
(byte) 0, // 0x02
....
(byte) 'B', // 0x2F
....
(byte) 'C' // 0xFF
};
InputStream inps = new MinhaFilterInputStream (new FileInputStream ("teste.bin"));
byte[] bytes = new byte[inps.available()];
inps.read(bytes);
inps.close();
}
}
Bom Dia!!!
Cara muito obrigado pela sua atenção, conseguir fazer o que queria depois que entendi o codigo que vc colocou aki, mas como nem tudo são flores… na realidade pretendo fazer um editor hexadecimal, pra me auxiliar com tradução de games.
Sendo assim, seria necessario usar as vezes em vez de
byte[] b = {((byte) 'a'}; //0x2E
usar
byte[] b = {(byte) 'the', (byte) 'is'};//0x00 ... 0xFF
Existe alguma forma de fazer isso?
sei que como mostrado acima não vai.
Tavez se eu fizer um tratamento pra toda vez q for imprimir, ex.: 0x2E ou invez de ‘.’ imprimir ‘is’, mas acredito que reduziria a dinamica do programa!
Tem alguma outra solução?
Hum, ‘the’ não cabe em um byte (precisa de 3 em codificação ISO-8859-1 e de 6 em codificação UTF-32, mais conhecida como “Unicode”.)
Você pode até usar a regra do FilterInputStream, mas acho que você, no seu caso, precisa de fazer isso que você falou (se == ‘.’ imprimir ‘this’, e assim por diante).