Je connais la structure de fichiers, supposons que cette structure soit ceci: de sorte que le fichier contient des chaînes de tels enregistrements. p> Quel est le plus élégant façon d'analyser un tel fichier en java? b> p> 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? P> 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? P> 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 em>, ainsi que les octets à emballer / déballés. Y a-t-il de telles choses dans Java / Apache Libs, etc. P> P>
3 Réponses :
Vous pouvez jeter un coup d'œil à cet exemple BinaryReader classe basée sur le DataGuTretstream classe. P>
Vous devriez être capable de le faire à l'aide d'un 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> 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.
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();
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;
Dupliqué possible de Meilleur moyen de lire des fichiers binaires structurés avec Java a>