You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java与Node.js字节处理差异及字节一致性技术问询

Java与Node.js中int转字节数组的差异解析

代码示例与运行结果

Java代码及输出

System.out.println((byte)254);
System.out.println(Integer.toHexString((byte)254));

// 输出:
// -2
// fffffffe

Node.js代码及输出

> parseInt(Buffer.from([254]).toString('hex'), 16)
254
> Buffer.from([254]).toString('hex')
'fe'

疑问解答

1. 为何Java将254转换为byte后输出-2,而Node.js输出254?

Java中的byte是有符号8位整数,取值范围是-128到127。254超出了这个范围,会发生溢出:254的二进制是11111110,作为有符号byte时,最高位是符号位(1代表负数),按补码规则计算,对应的十进制值就是-2。

而Node.js的Buffer存储的是无符号8位字节,取值范围是0到255,直接把254当作无符号值处理,所以输出254。

2. Java生成的十六进制字符串前缀带有6个f,而Node.js仅输出'fe'?

Java的Integer.toHexString()方法接收int类型参数,当传入byte类型的254(实际是-2)时,会先做符号扩展:把8位的有符号byte扩展为32位的int,负数的符号扩展会在高位补1,-2对应的32位int二进制是11111111 11111111 11111111 11111110,转成十六进制就是fffffffe。

Node.js的Buffer.toString('hex')直接将每个8位无符号字节转换为两位十六进制字符串,254的十六进制就是fe,不会做高位扩展。

3. 两种语言中的该字节是否本质相同?

本质上存储的二进制内容完全相同,都是11111110。差异仅在于两种语言对这个字节的解析方式:Java将其视为有符号byte,Node.js将其视为无符号字节,所以展示的十进制值和十六进制字符串形式不同,但底层的字节数据是一致的。

内容的提问来源于stack exchange,提问作者Joey Yi Zhao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 05:54:09