readallbytes read from example bytes array java c# binary byte fileinputstream

read - Obtener bytes incorrectos de Java en comparación con C#



streamreader to byte array c# (2)

Me di cuenta de cuál fue mi error en este punto. Ahora que se ha implementado LittleEndianDataInputStream , puedo usar SkipBytes correctamente para establecer mi posición de byte inicial, y devolveré el título de cadena según sea necesario. Por supuesto, inicialmente solo produciré los primeros 24 bytes, ya que lo que esté en los primeros 4 bytes del archivo binario debe contener una longitud de 24 para alguna propiedad dada en el archivo FRX. Debo establecer el desplazamiento con skipBytes para producir algo significativo, porque las longitudes de las propiedades en los archivos FRX se almacenan en grupos de 4 bytes y son seguidas por los bytes que contienen esa propiedad.

Por ejemplo, si configuro din.skipBytes(308); , entonces los bytes 308 a 312 en el archivo FRX mantienen la longitud del byte de la cadena en la propiedad Caption que requiero (por ejemplo 140), que es producida por readInt . Por lo tanto, los siguientes 140 bytes contendrán mi cadena requerida, y mi ciclo for iterará correctamente.

Así que tengo algunos archivos binarios FRX de los cuales estoy tratando de obtener leyendas con los métodos de lectura binarios de Java.

Yo era capaz de hacerlo, y especificando la región en la cual leer bytes en C # usando el siguiente programa:

using System; using System.Collections.Generic; using System.Text; using System.IO; public class GetFromFRX { public static void Main() { StringBuilder buffer = new StringBuilder(); using (BinaryReader b = new BinaryReader(File.Open("frmResidency.frx", FileMode.Open))) { try { b.BaseStream.Seek(641, SeekOrigin.Begin); int length = b.ReadInt32(); for (int i = 0; i < length; i++) { buffer.Append(b.ReadChar()); } } catch (Exception e) { Console.WriteLine( "Error obtaining resource/n" + e.Message); } } Console.WriteLine(buffer); } }

Actualización de pregunta: Al intentar hacer lo mismo en Java, he creado el siguiente programa. Ahora he implementado Guava para usar equivalentes LittleEndian , sin embargo, ahora mi longitud imprime 24, y como resultado solo obtengo los primeros 24 bytes en mi archivo de salida. ¿ ReadInt no es apropiado para esta situación y funciona de manera diferente a ReadInt32 ?

import java.io.*; import com.google.common.io.*; public class RealJavaByteReader { public static void main(String[] args) throws IOException { FileInputStream in = null; FileOutputStream out = null; try { in = new FileInputStream("frmResidency.frx"); LittleEndianDataInputStream din = new LittleEndianDataInputStream(in); out = new FileOutputStream("output.txt"); int length = din.readInt(); System.out.println(length); int c; for (c = 0; c < length; c++) { // TODO: first read byte and check for EOF out.write(din.read()); } } finally { if (in != null) { in.close(); } if (out != null) { out.close(); } } } }


Elizion,

Esto podría deberse a que podrías estar leyendo un int almacenado usando little endian. Como tal, Java usa Big endian y .NET little endian.

Utilice una función como la siguiente para convertir un pequeño int endian a un int grande int en java.

/** * Byte swap a single int value. * * @param value Value to byte swap. * @return Byte swapped representation. */ public static int swap (int value) { int b1 = (value >> 0) & 0xff; int b2 = (value >> 8) & 0xff; int b3 = (value >> 16) & 0xff; int b4 = (value >> 24) & 0xff; return b1 << 24 | b2 << 16 | b3 << 8 | b4 << 0; }

Intenta ver la publicación a continuación.

Convirtiendo a Little Endian en Big Endian