
java 中 char 占 2 字节(utf-16 编码),可通过位运算将高位字节与低位字节分别提取为 byte 类型,适用于底层协议处理、字节序列构造等场景。
在 Java 中,char 是 16 位无符号整数类型(取值范围 0x0000 ~ 0xFFFF),底层以 UTF-16 编码存储。虽然它逻辑上表示一个 Unicode 字符,但其二进制表示本质是两个连续的字节:低字节(LSB)和高字节(MSB)。要将其拆分为两个独立的 byte 值,可利用位运算完成:
- (byte) ch:直接截断强转,等价于取低 8 位(即 ch & 0xFF),得到低字节;
- (byte) (ch >> 8):先右移 8 位,再强制转为 byte,等价于取高 8 位(即 (ch >> 8) & 0xFF),得到高字节。
以下为完整示例代码:
char ch = '文'; // Unicode U+6587,UTF-16 编码即 0x6587
byte b1 = (byte) ch; // 低字节 → 0x87
byte b2 = (byte) (ch >> 8); // 高字节 → 0x65
System.out.printf("Low byte: %02x, High byte: %02x%n", b1, b2);
// 输出:Low byte: 87, High byte: 65⚠️ 注意事项:
- 此方法获取的是 UTF-16 编码下的原始字节序(小端?大端?):Java 内部 char 在内存中按平台无关的逻辑顺序存储(高字节在前,即“网络字节序”风格),但上述位运算结果对应的是 大端(Big-Endian)布局 —— b2 是高字节,b1 是低字节,组合为 (b2
- 若需按特定字节序(如小端)序列化,应显式调整顺序;若用于 I/O(如写入 DataOutputStream),推荐使用 writeChar() 方法,它自动按大端写入。
- 此技巧不适用于代理对(surrogate pairs) 表示的增补字符(如 emoji ?),因为单个 char 无法表示它们——此时应改用 int(codePoint)并配合 Character.toChars() 和 ByteBuffer 等更健壮的编码工具。
总结:通过位移与强制类型转换,可安全、高效地从 char 中分离出两个原始字节,是理解 Java 字符底层表示与实现轻量级二进制协议的重要基础操作。
立即学习“Java免费学习笔记(深入)”;










