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

整数转单字节字符写入文件后UTF-8解码异常问题求助

解决整数转指定字节写入文件的编码问题

你的核心问题是混淆了「原始字节写入」和「字符编码写入」:Java的char是基于UTF-16的Unicode字符,当你把(char)245这类值转成String后,用UTF-8写入文件时,会自动将Unicode字符编码为UTF-8对应的多字节(比如õ对应0xC3B5,±对应0xC2B1),这和你需要直接写入0xB1、0xF5原始字节的需求完全冲突。

解决方案:直接操作字节流写入

跳过String/Character的转换环节,直接将整数拆分后的高低位转为字节,用字节输出流写入文件,彻底避免字符编码的干扰。

修正后的写入代码

import java.io.FileOutputStream;
import java.io.IOException;

public class RawByteWriter {
    public static void main(String[] args) {
        int targetInt = 45557;
        
        // 拆分出高低位字节(强制转byte,Java byte是有符号类型,但写入时会保留原始字节值)
        byte highByte = (byte) ((targetInt >> 8) & 0xFF); // 对应0xB1
        byte lowByte = (byte) (targetInt & 0xFF);         // 对应0xF5
        
        // 使用字节输出流直接写入原始字节
        try (FileOutputStream fos = new FileOutputStream("output.raw")) {
            fos.write(highByte); // 先写高位字节0xB1
            fos.write(lowByte);  // 再写低位字节0xF5
            
            // 控制台验证字节值(&0xFF是为了将有符号byte转为无符号整数显示)
            System.out.printf("高位字节十六进制: 0x%02X%n", highByte & 0xFF);
            System.out.printf("低位字节十六进制: 0x%02X%n", lowByte & 0xFF);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

后续读取还原整数的代码

如果需要读取文件还原原始整数,同样用字节流处理:

import java.io.FileInputStream;
import java.io.IOException;

public class RawByteReader {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("output.raw")) {
            byte[] buffer = new byte[2];
            fis.read(buffer);
            
            // 还原整数:高位字节左移8位,与低位字节做或运算
            int restoredInt = ((buffer[0] & 0xFF) << 8) | (buffer[1] & 0xFF);
            System.out.printf("还原的整数: %d%n", restoredInt); // 输出45557
            System.out.printf("十六进制表示: 0x%04X%n", restoredInt); // 输出0xB1F5
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

关键说明

  • 必须使用FileOutputStream这类字节流,而非FileWriter等字符流,后者会默认用系统编码或指定编码处理字符,破坏原始字节。
  • 拆分字节时用& 0xFF确保获取正确的8位无符号值,避免Java有符号byte的数值偏差。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 11:56:06