• 欢迎来到Minecraft插件百科!
  • 对百科编辑一脸懵逼?帮助:快速入门带您快速熟悉百科编辑!
  • 因近日遭受攻击,百科现已限制编辑,有意编辑请加入插件百科企鹅群:223812289

“Data Types”的版本间的差异

来自Minecraft插件百科
跳转至: 导航搜索
Fixed-point numbers
第1行: 第1行:
All data sent over the network is [[wikipedia:Endianness#Big-endian|big-endian]], that is the bytes are sent from most significant byte to least significant byte. The majority of everyday computers are little-endian, therefore it may be necessary to change the endianness before sending data over the network.
+
所有通过网络发送的数据均为大端序([[wikipedia:Endianness#Big-endian|big-endian]],这意味着字节被从高位向低位发送。日常中大多数的计算机为小端序,所以可能需要在发送数据到网络之前将其转换为大端序。
  
 
{| class="wikitable"
 
{| class="wikitable"
第5行: 第5行:
 
  ! Name
 
  ! Name
 
  ! Size (bytes)
 
  ! Size (bytes)
  ! Encodes
+
  ! Encodes  
 
  ! Notes
 
  ! Notes
 
  |-
 
  |-
第134行: 第134行:
 
=== 位置 ===
 
=== 位置 ===
  
64-bit value split in to three parts
+
分成 3 部分的 64 个比特位
  
 
* x: 26 MSBs
 
* x: 26 MSBs
第140行: 第140行:
 
* y: 12 bits between them
 
* y: 12 bits between them
  
Encoded as followed:
+
像这样编码:
  
 
  ((x & 0x3FFFFFF) << 38) | ((y & 0xFFF) << 26) | (z & 0x3FFFFFF)
 
  ((x & 0x3FFFFFF) << 38) | ((y & 0xFFF) << 26) | (z & 0x3FFFFFF)
  
And decoded as:
+
像这样解码:
  
 
  long val; // Encoded value
 
  long val; // Encoded value
第151行: 第151行:
 
  z = val << 38 >> 38
 
  z = val << 38 >> 38
  
Note: The details of bit shifting are rather language dependent; the above may work in Java but probably won't in other languages without some tweaking.
+
Note: 位移的细节是和编程语言相关的;以上代码若没有调整可能在 Java 中正确运行但在其他语言中无法正确运行。
  
 
=== 定点数据 ===
 
=== 定点数据 ===
  
Some fields may be stored as [https://en.wikipedia.org/wiki/Fixed-point_arithmetic fixed-point numbers], where a certain number of bits represents the signed integer part (number to the left of the decimal point) and the rest represents the fractional part (to the right). Floating points (float and double), in contrast, keep the number itself (mantissa) in one chunk, while the location of the decimal point (exponent) is stored beside it.
+
有些域可能会被存储为 [https://en.wikipedia.org/wiki/Fixed-point_arithmetic 定点数(fixed point)],即使用一定数量的比特位来存储小数的整数部分(小数点的左边),其余比特位表示小数部分 (小数点的右边)。浮点数 (float double) 则相反,它将数字本身(底数)放在一个块里, 小数点的位置(指数)在其一旁存储。
  
Essentially, while fixed-point numbers have lower range than floating points, their fractional precision is greater for higher values. This makes them ideal for representing global coordinates of an entity in Minecraft, as it's more important to store the integer part accurately than position them more precisely within a single block (or meter).
+
实际上,虽然定点数的范围比浮点数小,但他们对于更高数值的精度更高。这使得他们成为在Minecraft中表示一个实体的全局坐标的理想选择,因为比起在一个方块(或一米)中精确的确定他们的位置而言,存储表示他们所在方块的整数部分显得更重要。
  
 
Coordinates are often represented as a 32-bit integer, where 5 of the least-significant bits are dedicated to the fractional part, and the rest store the integer part.
 
Coordinates are often represented as a 32-bit integer, where 5 of the least-significant bits are dedicated to the fractional part, and the rest store the integer part.

2016年7月18日 (一) 21:52的版本

所有通过网络发送的数据均为大端序(big-endian,这意味着字节被从高位向低位发送。日常中大多数的计算机为小端序,所以可能需要在发送数据到网络之前将其转换为大端序。

Name Size (bytes) Encodes Notes
Boolean 1 false or true Value can be either true (0x01) or false (0x00)
Byte 1 -128 to 127 Signed 8-bit integer, two's complement
Unsigned Byte 1 0 to 255 Unsigned 8-bit integer
Short 2 -32768 to 32767 Signed 16-bit integer, two's complement
Unsigned Short 2 0 to 65535 Unsigned 16-bit integer
Int 4 -2147483648 to 2147483647 Signed 32-bit integer, two's complement
Long 8 -9223372036854775808 to 9223372036854775807 Signed 64-bit integer, two's complement
Float 4 Single-precision 32-bit IEEE 754 floating point
Double 8 Double-precision 64-bit IEEE 754 floating point
String ≥ 1
≤ 2147483652
A sequence of Unicode code points UTF-8 string prefixed with its size in bytes as a VarInt
Chat ≥ 1
≤ 2147483652
See Chat Encoded as a String
VarInt ≥ 1
≤ 5
-2147483648 to 2147483647 Protocol Buffer Varint, encoding a two's complement signed 32-bit integer
VarLong ≥ 1
≤ 10
-9223372036854775808 to 9223372036854775807 Protocol Buffer Varint, encoding a two's complement signed 64-bit integer
Chunk Varies A vertical chunk column See SMP Map Format#Data
Metadata Varies See Entities#Entity Metadata Format
Slot Varies See Slot Data
Object Data 4 or 10 See Object Data
NBT Tag Varies See NBT
Position 8 Integer/block position: x (-33554432 to 33554431), y (-2048 to 2047), z (-33554432 to 33554431) x as a 26-bit integer, followed by y as a 12-bit integer, followed by z as a 26-bit integer (all signed, two's complement). See also the section below.
Angle 1 Rotation angle in steps of 1/256 of a full turn Whether or not this is signed does not matter, since the resulting angles are the same.
UUID 16 A UUID The vanilla Minecraft server internally sends this as two longs.
this.writeLong(uuid.getMostSignificantBits());
this.writeLong(uuid.getLeastSignificantBits());
Optional X 0 or size of X A field of type X, or nothing Whether or not the field is present must be known from the context.
Array of X count times size of X Zero or more fields of type X The count must be known from the context.
Byte Array Varies Depends on context This is just a sequence of zero or more bytes, its meaning should be explained somewhere else, e.g. in the packet description. The length must also be known from the context.

位置

分成 3 部分的 64 个比特位

  • x: 26 MSBs
  • z: 26 LSBs
  • y: 12 bits between them

像这样编码:

((x & 0x3FFFFFF) << 38) | ((y & 0xFFF) << 26) | (z & 0x3FFFFFF)

像这样解码:

long val; // Encoded value
x = val >> 38;
y = (val >> 26) & 0xFFF
z = val << 38 >> 38

Note: 位移的细节是和编程语言相关的;以上代码若没有调整可能在 Java 中正确运行但在其他语言中无法正确运行????。

定点数据

有些域可能会被存储为 定点数(fixed point),即使用一定数量的比特位来存储小数的整数部分(小数点的左边),其余比特位表示小数部分 (小数点的右边)。浮点数 (float 和 double) 则相反,它将数字本身(底数)放在一个块里, 小数点的位置(指数)在其一旁存储。

实际上,虽然定点数的范围比浮点数小,但他们对于更高数值的精度更高。这使得他们成为在Minecraft中表示一个实体的全局坐标的理想选择,因为比起在一个方块(或一米)中精确的确定他们的位置而言,存储表示他们所在方块的整数部分显得更重要。

Coordinates are often represented as a 32-bit integer, where 5 of the least-significant bits are dedicated to the fractional part, and the rest store the integer part.

Java lacks support for fractional integers directly, but you can represent them as integers. To convert from a double to this integer representation, use the following formulas:

 abs_int = (int)double * 32;

And back again:

 double = (double)abs_int / 32;