Leitura de Bytes.

25/04/2011

0

Caros amigos, estou tendo um pouco de dificuldade em ler um determinado arquivo que foi gravado em bytes.

Vou dar uma breve explicação da extrutura do arquivo .sgy

Para tentar testar o arquivo baixe este arquivo http://apps1.gdr.nrcan.gc.ca/lithoprobe/nwt/fgp89_3_stk2.sgy

o arquivo possui um total de 3200 bytes que estão armazenados em ACII.
400 Bytes em Bynario.

A minha maior dificuldade está em ordenar os bytes do binario.
Vou dar um exemplo.

Como a imagem mostra a leitura do arquivo binario é realizada byte a byte. Do byte 1 até o 4 obten-se um valor
Minha dificuldade esta na leitura e ordenação dos bytes.

Um exemplo da leitura do arquivo byte a byte.
Na verdade estou realizando um skip dos 3200 byte é estou lendo os proximos 400 primeiros bytes.
Na imagem mostra que do byte 1 ao 4 temos o valor 1,  mas nem sempre é este valor.
Em alguns arquivos em cada byte existe um valor mas quando leio ordenadamente me tras o resultado errado.
Então fico testando invertendo até achar o valor correto.

Segue o meto que estou usando para leitura.

public static void lerarq()
    {
        File file = new File("d:/fgp89_2_stk2.sgy");
        try {
            FileInputStream stream = new FileInputStream(file);
            byte[] buf = new byte[240];
            binhead = new byte[240];
            stream.skip(3600);
            stream.read(buf);
            stream.read(binhead);
            //System.out.println(binhead.length);
            System.out.println(Integer.toHexString((binhead[3]&0xff)));
           
           
           
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

Segue alguns metodos que achei para realizar a leitura e ordenar os bytes, mas estou com dificuldade em aplicar estes metodos na leitura que estou fazendo.


 /**
   * Converte o campo binário para um valor do tipo <code>Double</code>.
   *
   * @param offset índice do campo no array.
   *
   * @return O valor do campo binário convertido.
   */
  private Number convertToDouble(int offset) {
    return new Double(((header[offset] & 0xff) << 56)
      | ((header[offset + 1] & 0xff) << 48)
      | ((header[offset + 2] & 0xff) << 40)
      | ((header[offset + 3] & 0xff) << 32)
      | ((header[offset + 4] & 0xff) << 24)
      | ((header[offset + 5] & 0xff) << 16)
      | ((header[offset + 6] & 0xff) << 8) | (header[offset + 7] & 0xff));
  }
**
   * Converte o campo binário para um valor do tipo <code>Integer</code>.
   *
   * @param offset índice do campo no array.
   *
   * @return O valor do campo binário convertido.
   */
  private Number convertToInteger(int offset) {
    return new Integer(((header[offset] & 0xff) << 24)
      | ((header[offset + 1] & 0xff) << 16)
      | ((header[offset + 2] & 0xff) << 8) | (header[offset + 3] & 0xff));
  }

  /**
   * Converte o campo binário para um valor do tipo inteiro sem sinal, guardado
   * em um valor do tipo <code>Long</code>.
   *
   * @param offset índice do campo no array.
   *
   * @return O valor do campo binário convertido.
   */
  private Number convertToUnsignedInteger(int offset) {
    return new Long((long) ((header[offset] & 0xff) << 24)
      | (long) ((header[offset + 1] & 0xff) << 16)
      | (long) ((header[offset + 2] & 0xff) << 8)
      | (long) (header[offset + 3] & 0xff));
  }

  /**
   * Converte o campo binário para um valor do tipo <code>Short</code>.
   *
   * @param offset índice do campo no array.
   *
   * @return O valor do campo binário convertido.
   */
  private Number convertToShort(int offset) {
    return new Short(
      (short) (((header[offset] & 0xff) << 8) | (header[offset + 1] & 0xff)));
  }

  /**
   * Converte o campo binário para um valor do tipo short sem sinal, guardado em
   * um valor do tipo <code>Integer</code>.
   *
   * @param offset índice do campo no array.
   *
   * @return O valor do campo binário convertido.
   */
  private Number convertToUnsignedShort(int offset) {
    return new Integer(((header[offset] & 0xff) << 8)
      | (header[offset + 1] & 0xff));
  }

  /**
   * Converte o campo binário para um valor do tipo <code>Byte</code>.
   *
   * @param offset índice do campo no array.
   *
   * @return O valor do campo binário convertido.
   */
  private Number convertToByte(int offset) {
    return new Byte(header[offset]);
  }

  /**
   * Converte o campo binário para um valor do tipo byte sem sinal, guardado em
   * um valor do tipo <code>Short</code>.
   *
   * @param offset índice do campo no array.
   *
   * @return O valor do campo binário convertido.
   */
  private Number convertToUnsignedByte(int offset) {
    return new Short((short) (header[offset] & 0xff));
  }

  /**
   * Constrói um <code>SegyBinaryHeader</code> para representar o cabeçalho
   * binário de um arquivo SEGY.
   *
   * @param header O array de bytes de um cabeçalho binário.
   * @param headerFormat O formato dos campos de um cabeçalho binário.
   */
  public SegyBinaryHeader(byte[] header, cgHeaderFormat headerFormat) {
    this.header = header;
    this.headerFields = headerFormat.getHeaderFields();
  }








David Alberto

David Alberto

Responder

Posts

26/04/2011

Dyego Carmo

Voce quer ler byte a byte e agrupa-los de 8 em 8 ?

Responder

26/04/2011

David Alberto

Quase isso, mas como eu mostrei na imagem. Para obtermos um determinado valor precisamos ler 4 bytes.

Mas as vezes os bytes estão desordenados como por exemplo.



Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar