6
votes

Lire des données structurées de fichier binaire -?

Je connais la structure de fichiers, supposons que cette structure soit ceci: xxx

de sorte que le fichier contient des chaînes de tels enregistrements.

Quel est le plus élégant façon d'analyser un tel fichier en java?

supposé, nous pouvons définir un tableau d'octets [] de longueur totale et la lire avec INPUTREAM, mais comment convertir ensuite ses sous-éléments en valeurs inteer correctes?

première chose, la valeur des octets en Java est signée, nous avons besoin de valeur non signée dans notre cas. La prochaine chose, existe-t-il des méthodes utiles permettant de convertir une sous-réseau d'octets, par exemple, des octets de 1-st au 4-ème dans une valeur entière correcte?

Je sais bien, il y a des fonctions Pack & Déboquez-vous dans Perl, qui vous permettent de représenter une chaîne d'octets comme une expression, disons «VV» signifie 2 valeurs intégrées non signées. Vous définissez une telle chaîne et fournissez-la sous forme d'argument à un ou ou les fonctions , ainsi que les octets à emballer / déballés. Y a-t-il de telles choses dans Java / Apache Libs, etc.


3 Réponses :



1
votes

Vous devriez être capable de le faire à l'aide d'un DataGuTretstream code>. Cela fait longtemps que j'ai eu beaucoup de développement comme celui-ci, mais l'astuce que je semble rappelez-vous, c'est que s'il y a une mauvaise correspondance entre votre format d'entrée et les types de données de la langue, vous devez construire l'octet de données par octet. . Dans ce cas, on dirait que vous aurez besoin de le faire car la structure de données a des structures de taille étrangement.

Pour vous donner un exemple pour lire le premier enregistrement, vous pourriez avoir besoin de faire quelque chose comme ça (j'utilise un , B et C pour les attributs de l'enregistrement) P>

DataInputStream dis = ...

int a = 0;
a = dis.readByte();
a = a << 8;         
a = a | dis.readByte();
a = a << 8;
a = a | dis.readByte();

short b = 0;
b = dis.readByte();

long c = 0;
c = dis.readByte();
c = c << 8;
c = c | dis.readByte();
c = c << 8;
c = c | dis.readByte();
c = c << 8;
c = c | dis.readByte();
  • octet = 1 octet li>
  • courte = 16 bits, 2 octets li>
  • int = 32 bits, 4 octets li>
  • Long = 64 bits, 8 octets li> ul> p>


0 commentaires

3
votes

Comme @Bryan Kyle exemple mais plus court. J'aime Shorter, mais cela ne veut pas dire plus clair, vous décidez. ;) Remarque: readbyte () est signé et aura des résultats inattendus si non masqué avec 0xFF.

ByteBuffer bb = 
bb.position(a_random_postion);
int a = (bb.get() & 0xFF) << 16 | (bb.get() & 0xFF) << 8 | (bb.get() & 0xFF); 
short b = (short) (bb.get() & 0xFF); 
long c = bb.readInt() & 0xFFFFFFFFL; 


0 commentaires