rswiki-book/Data-Types.mediawiki

111 lines
3.0 KiB
Plaintext

== 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 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
(A1 smallest D4 biggest byte)