不同的机器可能会使用不同的字节排序方法来存储数据。“Big endian(高位优先)”将最
重要的字节存放在地址最低的存储器单元。而”little endian(低位优先)”则是将最重要的
字节放在地址最高的存储器单元。当存储量大于一个字节时,像 int,float 等,我们就要考
虑字节的顺序问题了。ByteBuffer 是以 Big endian 的形式存储数据的,并且数据在网上
传送时也常常使用 Big endian 形式。我们可以使用带有参数 ByteOrder.BIG_ENDIAN 或
ByteOrder.LITTLE_ENDIAN 的 order()方法改变 ByteBuffer 的 endian-ness。
如果我们以 short(ByteBuffer.asShortBuffer( ))形式读取数据,得到的数字是 97
(00000000 01100001);但是如果将 ByteBuffer 更改成 little endian,仍以 short 形
式读取数据,得到的数字却是 24832 (01100001 00000000)。
这个例子展示了怎样通过 endian 设置来改变字符中的字节次序:
//: c12:Endians.java
// Endian differences and data storage.
import java.nio.*;
import com.bruceeckel.simpletest.*;
import com.bruceeckel.util.*;
public class Endians {
private static Test monitor = new Test();
public static void main(String[] args) {
ByteBuffer bb = ByteBuffer.wrap(new byte[12]);
bb.asCharBuffer().put("abcdef");
System.out.println(Arrays2.toString(bb.array()));
bb.rewind();
bb.order(ByteOrder.BIG_ENDIAN);
bb.asCharBuffer().put("abcdef");
System.out.println(Arrays2.toString(bb.array()));
bb.rewind();
bb.order(ByteOrder.LITTLE_ENDIAN);
bb.asCharBuffer().put("abcdef");
System.out.println(Arrays2.toString(bb.array()));
monitor.expect(new String[]{
"[0, 97, 0, 98, 0, 99, 0, 100, 0, 101, 0, 102]",
"[0, 97, 0, 98, 0, 99, 0, 100, 0, 101, 0, 102]",
"[97, 0, 98, 0, 99, 0, 100, 0, 101, 0, 102, 0]"
});
}
} ///:~
ByteBuffer 有足够的空间存储作为外部缓冲器的 charArray 中的所有字节,因此可以调用
array()方法显示视图底层的字节。array( ) 方法是“可选的”,并且我们只能对由数组支
持的缓冲器调用此方法;否则,将会抛出 UnsupportedOperationException。
通过 CharBuffer 视图可以将 charArray 插入到 ByteBuffer 中。在底层的字节被显示时,
我们会发现缺省次序和随后的 big endian 次序相同;然而 little endian 次序则与之相反,
重要的字节存放在地址最低的存储器单元。而”little endian(低位优先)”则是将最重要的
字节放在地址最高的存储器单元。当存储量大于一个字节时,像 int,float 等,我们就要考
虑字节的顺序问题了。ByteBuffer 是以 Big endian 的形式存储数据的,并且数据在网上
传送时也常常使用 Big endian 形式。我们可以使用带有参数 ByteOrder.BIG_ENDIAN 或
ByteOrder.LITTLE_ENDIAN 的 order()方法改变 ByteBuffer 的 endian-ness。
如果我们以 short(ByteBuffer.asShortBuffer( ))形式读取数据,得到的数字是 97
(00000000 01100001);但是如果将 ByteBuffer 更改成 little endian,仍以 short 形
式读取数据,得到的数字却是 24832 (01100001 00000000)。
这个例子展示了怎样通过 endian 设置来改变字符中的字节次序:
//: c12:Endians.java
// Endian differences and data storage.
import java.nio.*;
import com.bruceeckel.simpletest.*;
import com.bruceeckel.util.*;
public class Endians {
private static Test monitor = new Test();
public static void main(String[] args) {
ByteBuffer bb = ByteBuffer.wrap(new byte[12]);
bb.asCharBuffer().put("abcdef");
System.out.println(Arrays2.toString(bb.array()));
bb.rewind();
bb.order(ByteOrder.BIG_ENDIAN);
bb.asCharBuffer().put("abcdef");
System.out.println(Arrays2.toString(bb.array()));
bb.rewind();
bb.order(ByteOrder.LITTLE_ENDIAN);
bb.asCharBuffer().put("abcdef");
System.out.println(Arrays2.toString(bb.array()));
monitor.expect(new String[]{
"[0, 97, 0, 98, 0, 99, 0, 100, 0, 101, 0, 102]",
"[0, 97, 0, 98, 0, 99, 0, 100, 0, 101, 0, 102]",
"[97, 0, 98, 0, 99, 0, 100, 0, 101, 0, 102, 0]"
});
}
} ///:~
ByteBuffer 有足够的空间存储作为外部缓冲器的 charArray 中的所有字节,因此可以调用
array()方法显示视图底层的字节。array( ) 方法是“可选的”,并且我们只能对由数组支
持的缓冲器调用此方法;否则,将会抛出 UnsupportedOperationException。
通过 CharBuffer 视图可以将 charArray 插入到 ByteBuffer 中。在底层的字节被显示时,
我们会发现缺省次序和随后的 big endian 次序相同;然而 little endian 次序则与之相反,
交换了这些字节次序。