商城首页欢迎来到中国正版软件门户

您的位置:首页 >Java 中的 char 类型是 16 位的 Unicode 字符,它本身并不是由两个原始字节组成的。但在某些编码(如 UTF-8)中,一个 Unicode 字

Java 中的 char 类型是 16 位的 Unicode 字符,它本身并不是由两个原始字节组成的。但在某些编码(如 UTF-8)中,一个 Unicode 字

  发布于2026-02-23 阅读(0)

扫一扫,手机访问

如何从 Java 的 char 类型中提取两个原始字节

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 << 8) | (b1 & 0xFF) 可还原原 char。
  • 若需按特定字节序(如小端)序列化,应显式调整顺序;若用于 I/O(如写入 DataOutputStream),推荐使用 writeChar() 方法,它自动按大端写入。
  • 此技巧不适用于代理对(surrogate pairs) 表示的增补字符(如 emoji ?),因为单个 char 无法表示它们——此时应改用 int(codePoint)并配合 Character.toChars() 和 ByteBuffer 等更健壮的编码工具。

总结:通过位移与强制类型转换,可安全、高效地从 char 中分离出两个原始字节,是理解 Java 字符底层表示与实现轻量级二进制协议的重要基础操作。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注