Hallo,
Voor het parsen van een binair bestand moet ik een aantal bytes inlezen waarna deze omgezet worden naar de integer waarde die ze representeren (16, 24 en 32 bits integers).
Om de byte waarden in te lezen gebruik ik in java een FileInputReader waarmee ik via read() 1 byte in kan lezen of via read(byte[] buffer) een X aantal bytes in te lezen.
Dit lijkt goed te gaan, echter, ik krijg negatieve waarden terug in een aantal gevallen. Als ik de java documentatie er op na lees moet dit helemaal niet kunnen (-1 bij een fout, of anders een waarde tussen van 0 tot 255). Het omzetten van de ingelezen waarden gaat dus ook niet goed, de int waarde klopt niet (logisch).
Ik heb bijna exact dezelfde code in C# gemaakt waarmee alles wel goed gaat.
Voorbeeld code java:
Voorbeeld code C#:
Doe ik iets fout of is dit een bug in java? Het vage is dat de java code soms wel gewoon correct werkt.
Hij gaat onder andere fout op de volgende 2 byte waarden: 03 0F. Het resultaat dat ik krijg is: 03 -58 (decimaal). Voor de controle heb ik de returnwaarde van read in Java ook bekeken, maar hij geeft gewoon aan dat er 2 bytes gelezen zijn. Uit wanhoop nog gekeken of fs.read(buffer); en fs.read(buffer, 0, 2); wat uit maakt, maar beiden geven hetzelfde (foute) resultaat.
Voor het parsen van een binair bestand moet ik een aantal bytes inlezen waarna deze omgezet worden naar de integer waarde die ze representeren (16, 24 en 32 bits integers).
Om de byte waarden in te lezen gebruik ik in java een FileInputReader waarmee ik via read() 1 byte in kan lezen of via read(byte[] buffer) een X aantal bytes in te lezen.
Dit lijkt goed te gaan, echter, ik krijg negatieve waarden terug in een aantal gevallen. Als ik de java documentatie er op na lees moet dit helemaal niet kunnen (-1 bij een fout, of anders een waarde tussen van 0 tot 255). Het omzetten van de ingelezen waarden gaat dus ook niet goed, de int waarde klopt niet (logisch).
Ik heb bijna exact dezelfde code in C# gemaakt waarmee alles wel goed gaat.
Voorbeeld code java:
Java:
1
2
3
4
5
| private int bigEndInt16(BufferedInputStream fs) throws IOException { byte[] buffer = new byte[2]; int bytesRead = fs.read(buffer); return (buffer[1] + (buffer[0] << 8)); } |
Voorbeeld code C#:
C#:
1
2
3
4
5
6
| private int BigEndianInt16(ref FileStream fs) { byte[] buffer = new byte[2]; fs.Read(buffer, 0, 2); return (buffer[1] + (buffer[0] << 8)); } |
Doe ik iets fout of is dit een bug in java? Het vage is dat de java code soms wel gewoon correct werkt.
Hij gaat onder andere fout op de volgende 2 byte waarden: 03 0F. Het resultaat dat ik krijg is: 03 -58 (decimaal). Voor de controle heb ik de returnwaarde van read in Java ook bekeken, maar hij geeft gewoon aan dat er 2 bytes gelezen zijn. Uit wanhoop nog gekeken of fs.read(buffer); en fs.read(buffer, 0, 2); wat uit maakt, maar beiden geven hetzelfde (foute) resultaat.
...