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

