rswiki-book/src/Data-Types.md

86 lines
3.5 KiB
Markdown

== Introduction ==
RuneScape uses a number of standard and non-standard data types.
== Byte Order ==
Data types that are two bytes or larger can be stored and ordered in a
variety of different ways. Generally people either use big endian or
little endian.
=== Big Endian ===
In big endian order, the most significant byte (MSB) is stored first and
the least significant byte (LSB) is stored last.
=== Little Endian ===
In little endian order, the least significant byte (LSB) is stored first
and the most significant byte (MSB) is stored last.
=== Byte order in RuneScape ===
RuneScape uses both little and big-endian byte orders throughout the
protocol (however, the 194 client only uses big-endian order),
presumably to make reverse-engineering of the protocol harder. Some
confusion has arisen over the byte order as the data types are named
incorrectly in \[\[Server Winterlove\|Winterlove\]\]'s server where
little endian data types are incorrectly named as big endian types.
== Standard data types == These datatypes can also be read/written by a
DataWriter/DataReader implementation (DataStreams and Buffers)
Naming conventions: {\| border=2 ! Official name ! Datatype name ! Jagex
name ! Encoding \|- \| Byte \| byte \| 1,1b \|- \| \[\[Word\|WORD\]\] \|
short \| 2,2b \|- \| \[\[DWord\|DWORD\]\] \| int,int32 \| 4,4b \|- \|
\[\[QWord\|QWORD\]\] \| long,int64 \| 8,8b \|- \| C style string \|
string,String,char *,char\[\] \| str,strbyte \| text bytes then '\n' or
10 \|- \| Java style string \| string,String,char *,char\[\] \| strraw
\| WORD length then text bytes \|}
Note that \[\[Jagex\]\] used to use a new line character as string
terminator, in more recent versions they use the null character \\0 or 0
to support multi-line strings.
== Non Standard Data Types ==
{\| border=2 ! Winterlove's name ! Jagex name ! Read transformation !
Write transformation \|- \| Special A \| Unknown \| value - 128 \| value
+ 128 \|- \| Special C \| Unknown \| 0 - value \| 0 - value \|- \|
Special S \| Unknown \| 128 - value \| 128 - value \|- \| SpaceSaverA \|
smarts \| (value\[0\] \< 128) ? (((value\[0\] - 128)\<\<8)+value\[1\]) :
value\[0\] \| if(value \< 128) putword(value+32768) else putbyte(value);
\|- \| SpaceSaverB \| smart \| (value\[0\] \< 128) ? value\[0\] - 64 \|
((value\[0\]\<\<8)+value\[1\]) - 49152 \| if(i \< 64 && i \>= -64)
putbyte(i + 64) else if(i \< 16384 && i \>= -16384) putword(i + 49152);
\|- \| tribyte / RGBColour / 3Byte / int3 / medium \| 3 \| (value\[0\]
\<\< 24) + (value\[1\] \<\< 16) + value\[2\] \| putbyte(value \>\>
24);putbyte(value \>\> 16);putbyte(value); \|- \| \[\[RS
String\|RS\_String\]\] \| jstr \| Old engine: read until newline
delimiter ("\n") <br />New engine: read until null byte (value 0). \|
Old engine: write and finish with newline delimiter ("\n") <br />New
engine: write and finish with null byte (value 0). \|}
Additionally, RuneScape also uses two endian orders for integers that
are different from a big- or low endian order. Both byte orders are
called middle-endian.
Their orders could be described as following:
Middle-endian big int: C3 D4 A1 B2
Middle-endian small int: B2 A1 D4 C3
Where A1 is the smallest byte (LSB), and D4 the biggest byte (MSB).
== Bit Access ==
=== Initiating Bit Access ===
Whenever data is to be sent to the server or to the client using bits;
the stream needs to be prepared by setting the bit position. The bit
position can be calculated by multiplying the current buffer position by
8. This is because each byte is comprised of 8 bits.
Example: int bitPos = bufferPos \* 8;