I have a read code for a long number like below;
ByteArrayInputStream in;
public long readUInt64() throws IOException {
return readUInt16() | readUInt16() << 16L | readUInt16() << 32L | readUInt16() << 48L;
public int readUInt16() throws IOException {
return readWithEOF() | readWithEOF() << 8;
}
int readWithEOF() throws IOException {
int data = this.in.read();
if (data < 0)
throw new EOFException();
return data;
}
I have write file like below;
ByteArrayOutputStream baos;
public void writeUInt64(Long val) {
writeUInt16((int) (val >> 0L));
writeUInt16((int) (val >> 16L));
writeUInt16((int) (val >> 32L));
writeUInt16((int) (val >> 48L));
}
public void writeUInt16(int num) {
baos.write(num >> 0);
baos.write(num >> 8);
}
When I try to store a big value like 253402300799999L, the reading result is totally different. For small values the code runs fine. Assuming that changing read code is not possible, how can I fix this issue. thanks in advance.
CodePudding user response:
Your reading code is incorrect.
You need to cast int
to long
before shift (<<
).
return readUInt16()
| ((long)readUInt16()) << 16L
| ((long)readUInt16()) << 32L
| ((long)readUInt16()) << 48L;
So if you can't change your read code it is impossible to fix your problem.