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
相关产品推荐
相关产品推荐

