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;
}