Data type orders Jagex types - Shadowrs/osrs-refactor-revision-1 GitHub Wiki
Jagex data types
They swap around the byte order of shorts, tribytes, ints, longs etc just to make it an even larger pain.
Extra types:
- S (subtract) is 128-value
- A (Add) is value+128
- N (negative) is 0-value
Orders:
- BE (big ending) - default with the largest shift first
- LE (little ending) - non-shifted first
- Middle ending - starts with shift8
- Inverse middle - ends with shift 8
Smart
Writes a given value as a byte or short depending on the signed size
See also: 474 protocol explained
Signed & unsigned
Java default: Signed
Read more on the Java docs
- Signed value ranges from 0 to MAXVALUE
- Unsigned value ranges from (0-(MAXVALUE/2)) to (0+(MAXVALUE/2))
Such as;
Data Type | Signed range | Unsigned range | * possibilities |
---|---|---|---|
Byte | -127..+128 | 0-255 | 256 |
short | -16383..16384 | 0-32767 | 32768 |
int | -1.05b .. 1.05b | 0-2.1b | 2.1b |
long | -2.15T .. 2.15T | 0-4.3 T | 4.3 trillion |
Examples
writing integers
default: write BE (big end) int. largest shift first.
backing[pos - var1 - 4] = (byte) (var1 >> 24);
backing[pos - var1 - 3] = (byte) (var1 >> 16);
backing[pos - var1 - 2] = (byte) (var1 >> 8);
backing[pos - var1 - 1] = (byte) var1;
write LE int (little end, no shift first)
backing[++pos - 1] = (byte) var1;
backing[++pos - 1] = (byte) (var1 >> 8);
backing[++pos - 1] = (byte) (var1 >> 16);
backing[++pos - 1] = (byte) (var1 >> 24);
write in v1 (middle). shift 8 first.
backing[++pos - 1] = (byte) (var1 >> 8);
backing[++pos - 1] = (byte) var1;
backing[++pos - 1] = (byte) (var1 >> 24);
backing[++pos - 1] = (byte) (var1 >> 16);
write Int v2 (reverse middle). shift 8 last
backing[++pos - 1] = (byte) (var1 >> 16);
backing[++pos - 1] = (byte) (var1 >> 24);
backing[++pos - 1] = (byte) var1;
backing[++pos - 1] = (byte) (var1 >> 8);
reading integers
read BE
return (payload.get() & 0xff << 24)
| ((payload.get() & 0xff) << 16)
| ((payload.get() & 0xff) 8)
| ((payload.get() & 0xff));
or the default readInt() method of any networking library used
read LE
return (payload.get() & 0xff)
| ((payload.get() & 0xff) << 8)
| ((payload.get() & 0xff) << 16)
| ((payload.get() & 0xff) << 24);
read v1
return ((payload.get() & 0xff) << 8)
| ((payload.get() & 0xff))
| ((payload.get() & 0xff) << 24)
| ((payload.get() & 0xff) << 16);
read v2 (inverse)
return ((payload.get() & 0xff) << 16)
| ((payload.get() & 0xff) << 24)
| ((payload.get() & 0xff))
| ((payload.get() & 0xff) << 8);
Smart / compact
read
public int getSmart() {
int peek = payload.get(payload.position());
if(peek < 128) {
return ((get() & 0xFF) - 64);
} else {
return ((readShort() & 0xFFFF) - 49152);
}
}
public int getUSmart() {
int peek = payload.get(payload.position());
if(peek < 128) {
return (get() & 0xFF);
} else {
return (readShort() & 0xFFFF) - 32768;
}
}
write
public PacketBuilder putSmart(int val) {
if(val >= 128) {
writeShort((val + 32768));
} else {
writeByte((byte) val);
}
return this;
}
public PacketBuilder writeSmart(int val) {
if(val >= 128) {
writeShort((val + 49152));
} else {
writeByte((byte) (val + 64));
}
return this;
}