- 欢迎来到Minecraft插件百科!
- 对百科编辑一脸懵逼?帮助:快速入门带您快速熟悉百科编辑!
- 因近日遭受攻击,百科现已限制编辑,有意编辑请加入插件百科企鹅群:223812289
Data Types:修订间差异
跳转到导航
跳转到搜索
小无编辑摘要 |
|||
(未显示2个用户的6个中间版本) | |||
第1行: | 第1行: | ||
所有通过网络发送的数据均为大端序([[wikipedia:Endianness#Big-endian|big-endian]]),这意味着字节被从高位向低位发送。日常中大多数的计算机使用小端序存储,所以可能需要在发送数据到网络之前将其转换为大端序。 | |||
{| class="wikitable" | {| class="wikitable" | ||
|- | |- | ||
! | ! 名称 | ||
! | ! 长度 (字节) | ||
! | ! 内容 | ||
! | ! 注释 | ||
|- | |- | ||
! Boolean | ! Boolean | ||
| 1 | | 1 | ||
| false | | false 或 true | ||
| | | 值可以是 true (<code>0x01</code>) 或 false (<code>0x00</code>) | ||
|- | |- | ||
! Byte | ! Byte | ||
| 1 | | 1 | ||
| -128 | | -128 到 127 | ||
| | | 有符号的 8 位整型,[[wikipedia:Two's complement|负数补码]] | ||
|- | |- | ||
! Unsigned Byte | ! Unsigned Byte | ||
| 1 | | 1 | ||
| 0 to 255 | | 0 to 255 | ||
| | | 无符号的 8 位整型 | ||
|- | |- | ||
! Short | ! Short | ||
| 2 | | 2 | ||
| -32768 to 32767 | | -32768 to 32767 | ||
| | | 有符号 16 位整型,负数补码 | ||
|- | |- | ||
! Unsigned Short | ! Unsigned Short | ||
| 2 | | 2 | ||
| 0 | | 0 到 65535 | ||
| | | 无符号 16 位整型 | ||
|- | |- | ||
! Int | ! Int | ||
| 4 | | 4 | ||
| -2147483648 | | -2147483648 到 2147483647 | ||
| | | 有符号 32 位整型,负数补码 | ||
|- | |- | ||
! Long | ! Long | ||
| 8 | | 8 | ||
| -9223372036854775808 | | -9223372036854775808 到 9223372036854775807 | ||
| | | 有符号 64 位整型,负数补码 | ||
|- | |- | ||
! Float | ! Float | ||
| 4 | | 4 | ||
| [[wikipedia:Single-precision floating-point format| | | [[wikipedia:Single-precision floating-point format|单精度 32 位 IEEE 754 浮点数]] | ||
| | | | ||
|- | |- | ||
! Double | ! Double | ||
| 8 | | 8 | ||
| [[wikipedia:Double-precision floating-point format| | | [[wikipedia:Double-precision floating-point format|双精度 64 位 IEEE 754 浮点数]] | ||
| | | | ||
|- | |- | ||
! String | ! String | ||
| ≥ 1 <br />≤ 2147483652 | | ≥ 1 <br />≤ 2147483652 | ||
| | | 一个 [[wikipedia:Unicode|Unicode]] 编码序列 | ||
| [[wikipedia:UTF-8|UTF-8]] string | | [[wikipedia:UTF-8|UTF-8]] string 开头用 VarInt 以 byte 为单位表示它的长度 | ||
|- | |- | ||
! Chat | ! Chat | ||
| ≥ 1 <br />≤ 2147483652 | | ≥ 1 <br />≤ 2147483652 | ||
| | | 详见 [[Chat]] | ||
| | | 以 String 编码 | ||
|- | |- | ||
! VarInt | ! VarInt | ||
| ≥ 1 <br />≤ 5 | | ≥ 1 <br />≤ 5 | ||
| -2147483648 to 2147483647 | | -2147483648 to 2147483647 | ||
| [http://developers.google.com/protocol-buffers/docs/encoding#varints Protocol Buffer Varint] | | [http://developers.google.com/protocol-buffers/docs/encoding#varints Protocol Buffer Varint],编码了一个负数补码的有符号 32 位整型 | ||
|- | |- | ||
! VarLong | ! VarLong | ||
| ≥ 1 <br />≤ 10 | | ≥ 1 <br />≤ 10 | ||
| -9223372036854775808 to 9223372036854775807 | | -9223372036854775808 to 9223372036854775807 | ||
| [http://developers.google.com/protocol-buffers/docs/encoding#varints Protocol Buffer Varint] | | [http://developers.google.com/protocol-buffers/docs/encoding#varints Protocol Buffer Varint],编码了一个负数补码的有符号 64 位整型 | ||
|- | |- | ||
! Chunk | ! Chunk | ||
| | | 可变 | ||
| | | 一个垂直区块列 | ||
| | | 详见 [[SMP Map Format#Data]] | ||
|- | |- | ||
! Metadata | ! Metadata | ||
| | | 可变 | ||
| | | 详见 [[Entities#Entity Metadata Format]] | ||
| | | | ||
|- | |- | ||
! Slot | ! Slot | ||
| | | 可变 | ||
| | | 详见 [[Slot Data]] | ||
| | | | ||
|- | |- | ||
! Object Data | ! Object Data | ||
| 4 | | 4 或 10 | ||
| | | 详见 [[Object Data]] | ||
| | | | ||
|- | |- | ||
! NBT Tag | ! NBT Tag | ||
| | | 可变 | ||
| | | 详见 [[NBT]] | ||
| | | | ||
|- | |- | ||
! Position | ! Position | ||
| 8 | | 8 | ||
| | | 整型/方块坐标: x (-33554432 到 33554431), y (-2048 到 2047), z (-33554432 到 33554431) | ||
| x | | x 为一个 26 位整型,随着的是用 12 位整型表示的 y,然后是用 26 位整型表示的 z (均为有符号,负数补码)。同时参阅 [[#Position|下面的部分]]. | ||
|- | |- | ||
! Angle | ! Angle | ||
| 1 | | 1 | ||
| | | 以一整圈的 1/256 为步长的旋转角度 | ||
| | | 是否有符号没有关系因为结果的角度是相同的。 | ||
|- | |- | ||
! UUID | ! UUID | ||
| 16 | | 16 | ||
| | | 一个 [[wikipedia:Universally_unique_identifier|通用唯一识别码]] | ||
| | | 官方版本的 Minecraft 服务器内部以两个 long 发送。 | ||
<pre>this.writeLong(uuid.getMostSignificantBits()); | <pre>this.writeLong(uuid.getMostSignificantBits()); | ||
第117行: | 第117行: | ||
|- | |- | ||
! Optional X | ! Optional X | ||
| 0 | | 0 或 X 的长度 | ||
| | | 一个 X 类型的域或者什么都不是 | ||
| | | 域是否存在必须从上下文中得知。 | ||
|- | |- | ||
! Array of X | ! Array of X | ||
| | | X 的长度乘重复次数 | ||
| | | 零或以上个 X 类型的域 | ||
| | | 域的数量必须从上下文中得知。 | ||
|- | |- | ||
! Byte Array | ! Byte Array | ||
| | | 可变 | ||
| | | 依赖于上下文 | ||
| | | 这只是一个零或更多个 Byte 的序列,他的含义将会在其他地方被解释,例如:在包描述中。长度必须从上下文中得知。 | ||
|} | |} | ||
=== 位置 === | === 位置 === | ||
64 | 分成 3 部分的 64 个比特位 | ||
* x: 26 MSBs | * x: 26 MSBs | ||
第140行: | 第140行: | ||
* y: 12 bits between them | * y: 12 bits between them | ||
编码方法: | |||
((x & 0x3FFFFFF) << 38) | ((y & 0xFFF) << 26) | (z & 0x3FFFFFF) | ((x & 0x3FFFFFF) << 38) | ((y & 0xFFF) << 26) | (z & 0x3FFFFFF) | ||
解码方法: | |||
long val; // Encoded value | long val; // Encoded value | ||
第151行: | 第151行: | ||
z = val << 38 >> 38 | z = val << 38 >> 38 | ||
Note: | Note: 位移的细节是和编程语言相关的;以上代码若没有调整可能在 Java 中正确运行但在其他语言中无法正确运行。 | ||
=== | === 定点数据 === | ||
有些域可能会被存储为 [https://en.wikipedia.org/wiki/Fixed-point_arithmetic 定点数(fixed point)],即使用一定数量的比特位来存储数字的整数部分(小数点的左边),其余比特位表示小数部分 (小数点的右边)。浮点数 (float 和 double) 则相反,它将数字本身(底数)放在一个块里,小数点的位置(指数)在其一旁存储。 | |||
实际上,虽然定点数的范围比浮点数小,但他们对于更大的数值的精度更高。这使得他们成为在 Minecraft 中表示一个实体的全局坐标的理想选择,因为比起在一个方块(或一米)中精确的定位他们而言,能存储表示他们所在方块位置的整数部分显得更重要。 | |||
坐标通常被表示为一个 32 位的整型,地址最低的 5 位被用来存储小数部分,剩余的用来存储整数部分。 | |||
Java | Java 缺乏对带小数部分的整型的直接支持,但你可以将他们表示为整型(integer)。如果要从一个 double 转换到这个整型表示,使用以下公式: | ||
abs_int = (int)double * 32; | abs_int = (int)double * 32; | ||
逆向过程: | |||
double = (double)abs_int / 32; | double = (double)abs_int / 32; |
2016年7月18日 (一) 14:27的最新版本
所有通过网络发送的数据均为大端序(big-endian),这意味着字节被从高位向低位发送。日常中大多数的计算机使用小端序存储,所以可能需要在发送数据到网络之前将其转换为大端序。
名称 | 长度 (字节) | 内容 | 注释 |
---|---|---|---|
Boolean | 1 | false 或 true | 值可以是 true (0x01 ) 或 false (0x00 )
|
Byte | 1 | -128 到 127 | 有符号的 8 位整型,负数补码 |
Unsigned Byte | 1 | 0 to 255 | 无符号的 8 位整型 |
Short | 2 | -32768 to 32767 | 有符号 16 位整型,负数补码 |
Unsigned Short | 2 | 0 到 65535 | 无符号 16 位整型 |
Int | 4 | -2147483648 到 2147483647 | 有符号 32 位整型,负数补码 |
Long | 8 | -9223372036854775808 到 9223372036854775807 | 有符号 64 位整型,负数补码 |
Float | 4 | 单精度 32 位 IEEE 754 浮点数 | |
Double | 8 | 双精度 64 位 IEEE 754 浮点数 | |
String | ≥ 1 ≤ 2147483652 |
一个 Unicode 编码序列 | UTF-8 string 开头用 VarInt 以 byte 为单位表示它的长度 |
Chat | ≥ 1 ≤ 2147483652 |
详见 Chat | 以 String 编码 |
VarInt | ≥ 1 ≤ 5 |
-2147483648 to 2147483647 | Protocol Buffer Varint,编码了一个负数补码的有符号 32 位整型 |
VarLong | ≥ 1 ≤ 10 |
-9223372036854775808 to 9223372036854775807 | Protocol Buffer Varint,编码了一个负数补码的有符号 64 位整型 |
Chunk | 可变 | 一个垂直区块列 | 详见 SMP Map Format#Data |
Metadata | 可变 | 详见 Entities#Entity Metadata Format | |
Slot | 可变 | 详见 Slot Data | |
Object Data | 4 或 10 | 详见 Object Data | |
NBT Tag | 可变 | 详见 NBT | |
Position | 8 | 整型/方块坐标: x (-33554432 到 33554431), y (-2048 到 2047), z (-33554432 到 33554431) | x 为一个 26 位整型,随着的是用 12 位整型表示的 y,然后是用 26 位整型表示的 z (均为有符号,负数补码)。同时参阅 下面的部分. |
Angle | 1 | 以一整圈的 1/256 为步长的旋转角度 | 是否有符号没有关系因为结果的角度是相同的。 |
UUID | 16 | 一个 通用唯一识别码 | 官方版本的 Minecraft 服务器内部以两个 long 发送。
this.writeLong(uuid.getMostSignificantBits()); this.writeLong(uuid.getLeastSignificantBits()); |
Optional X | 0 或 X 的长度 | 一个 X 类型的域或者什么都不是 | 域是否存在必须从上下文中得知。 |
Array of X | X 的长度乘重复次数 | 零或以上个 X 类型的域 | 域的数量必须从上下文中得知。 |
Byte Array | 可变 | 依赖于上下文 | 这只是一个零或更多个 Byte 的序列,他的含义将会在其他地方被解释,例如:在包描述中。长度必须从上下文中得知。 |
位置
分成 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 中表示一个实体的全局坐标的理想选择,因为比起在一个方块(或一米)中精确的定位他们而言,能存储表示他们所在方块位置的整数部分显得更重要。
坐标通常被表示为一个 32 位的整型,地址最低的 5 位被用来存储小数部分,剩余的用来存储整数部分。
Java 缺乏对带小数部分的整型的直接支持,但你可以将他们表示为整型(integer)。如果要从一个 double 转换到这个整型表示,使用以下公式:
abs_int = (int)double * 32;
逆向过程:
double = (double)abs_int / 32;