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

ES6 writeLong方法异常:Java与JS十六进制输出不一致

解决JavaScript writeLong方法输出异常的问题

看起来你遇到了Java和JavaScript之间字节写入不匹配的问题,尤其是64位Long值的输出完全不符合预期。我来帮你排查并解决这个问题:

问题诊断

从你给出的输出对比来看,核心问题出在这两个方面:

  1. JavaScript数字精度限制:JS的Number类型是IEEE 754双精度浮点数,只能精确表示2^53以内的整数。你的目标Long值(0xFFFFFFFFFFFFD03F)远大于这个范围,直接用Number处理会丢失精度,导致写入的字节完全错误。
  2. 代码逻辑/字节序不匹配:Java默认使用**大端字节序(Big-Endian)**写入数值(高位字节在前),而你的writeLong方法大概率要么用了小端序,要么循环处理字节时的位移逻辑出错,才会出现重复的字节片段(EE 47 AF 15重复两次)。

修正后的解决方案

下面是修复后的BufferWriter类,专门处理大端字节序的Short和Long写入,同时用BigInt避免64位整数的精度丢失:

class BufferWriter {
  constructor(buffer) {
    this._buffer = buffer; // 这里假设buffer是一个可追加的数组(比如Uint8Array或普通数组)
  }

  // 写入单个字节
  writeByte(value) {
    this._buffer.push(value & 0xFF);
  }

  // 大端写入16位Short
  writeShort(value) {
    this.writeByte((value >> 8) & 0xFF); // 高位字节
    this.writeByte(value & 0xFF);        // 低位字节
  }

  // 大端写入64位Long(用BigInt避免精度丢失)
  writeLong(value) {
    const bigValue = BigInt(value);
    // 从最高位到最低位依次写入8个字节(大端序)
    for (let shift = 56; shift >= 0; shift -= 8) {
      const byte = Number((bigValue >> BigInt(shift)) & 0xFFn);
      this.writeByte(byte);
    }
  }
}

// 测试验证:生成你需要的正确输出
const outputBuffer = [];
const writer = new BufferWriter(outputBuffer);

// 写入Short值0x0015(对应十进制21)
writer.writeShort(0x0015);
// 写入Long值0xFFFFFFFFFFFFD03F(对应Java的原始Long值)
writer.writeLong(0xFFFFFFFFFFFFD03Fn);

// 转换为空格分隔的十六进制字符串
const hexResult = outputBuffer
  .map(byte => byte.toString(16).padStart(2, '0').toUpperCase())
  .join(' ');

console.log(hexResult); // 输出:00 15 FF FF FF FF FF FF D0 3F

关键细节说明

  • BigInt的必要性:直接用Number存储64位整数会触发精度丢失,比如0xFFFFFFFFFFFFD03F作为Number时会被近似为其他值,导致写入的字节完全错误。用BigInt可以完整保留64位整数的所有信息。
  • 严格匹配大端字节序:Java的DataOutputStream系列方法默认使用大端序,所以我们的writeLong从最高位(位移56位,对应第7个字节)开始,每次右移8位取出一个字节,确保和Java的输出顺序完全一致。
  • 修复循环逻辑:你之前的异常输出有重复字节,应该是循环中的位移值计算错误(比如没有正确递减),修正后的循环从56到0,每次减8,刚好覆盖64位的8个字节。

内容的提问来源于stack exchange,提问作者Adrian Preuss

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:51:41