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

Java短数值转字节数组异常:读写后输出文件与原格式不符

问题分析与解决方案

核心问题

你的写入逻辑writeShort和原数据的存储格式完全不匹配,同时读取逻辑readShort只是碰巧在当前数据(第二个字节全为0)下得到了正确结果,本质逻辑不符合原数据的实际存储规则。

原数据的每个字段是两个字节,格式为:[数值对应的单字节][0x00],比如:

  • day=15 对应十六进制 0F 00(0F是十进制15的十六进制表示,00是填充字节)
  • second=59 对应十六进制 3B 00(3B是十进制59的十六进制表示)

而你的writeShort错误地将数值拆分为个位和十位写入,比如15被拆为5(05)和1(01),导致输出变成05 01,完全偏离原格式。

解决方案

1. 修正写入方法(匹配原数据格式)

将writeShort修改为直接写入数值本身作为第一个字节,然后写入0作为第二个填充字节:

private static void writeShort(OutputStream stream, int value) throws IOException {
  // 写入数值对应的单字节(注意value必须在0-255范围内,你的数据满足)
  stream.write(value);
  // 写入原格式要求的第二个填充字节0x00
  stream.write(0);
}

2. 修正读取方法(还原正确逻辑)

原readShort方法的逻辑stream.read() + stream.read() *10是错误的,只是因为原数据第二个字节全为0才侥幸得到正确结果。正确的读取逻辑应该是读取第一个字节作为数值,跳过第二个填充字节:

private static int readShort(InputStream stream) throws IOException {
  int value = stream.read();
  // 跳过第二个填充字节(0x00)
  stream.read();
  return value;
}

验证结果

使用修正后的方法写入后,输出文件的十六进制内容会和原格式一致:
0F000200 17000000 07003B00

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:43:19