字符串编码UTF-8得到1个字节

问题描述 投票:0回答:1

当我尝试在文件中写入字符串时遇到问题。例如,我有这段代码将整数值转换为 2 字节字符串,但字符串编码将整数转换为不可见字节。

例如,我需要将 45557 整数转换为 2 个字节 0xB1 和 0xF5,并将其转换为字符串 õ±。然后,在其他过程中,对õ±进行解码,得到B1F5。 问题是当我尝试解码 õ± 时,我得到 C3B5C2B1。我现在遇到了字符串编码的问题,但是我该如何解决它?

我正在尝试这个。

int iInteger = 45557;
        
int iLow    =  iInteger & 0b0000000011111111;
int iHight  = (iInteger & 0b1111111100000000)>>8;
        
file_raw.open_file();
        
file_raw.println (" Caracter 1 num: " + iLow);
file_raw.println (" Caracter 2 num:" + iHight);
        
String cLow = new Character((char) 245).toString();
String cHigh = new Character((char) 177).toString();

然后,结果是

Caracter 1 num: 245
Caracter 2 num:177
Caracter 1 string: õ
Caracter 2 string :±

在你看来,这很好,但是当我将这些字符解码为十六进制时,我得到 16 位值,因为编码采用 UTF-8: õ -> C3B5(在记事本++或互联网转换器上转换) ± -> C2B1

我只想: õ -> F5 ± -> B1

java string utf-8 type-conversion decode
1个回答
0
投票

您应该直接使用原始字节数组,并避免在中间将它们转换为 String,因为 String 在 Java 内部使用 UTF-16,这会导致编码问题。

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

public class ByteFileExample {

    public static void main(String[] args) {
        int iInteger = 45557;

        byte iLow = (byte) (iInteger & 0xFF); // Low byte (F5)
        byte iHigh = (byte) ((iInteger >> 8) & 0xFF); // High byte (B1)

        try (FileOutputStream fos = new FileOutputStream("output.bin")) {
            fos.write(iHigh); // Write the high byte (B1)
            fos.write(iLow);  // Write the low byte (F5)
        } catch (IOException e) {
            e.printStackTrace();
        }

        try (FileInputStream fis = new FileInputStream("output.bin")) {
            int high = fis.read(); // Read the high byte (B1)
            int low = fis.read();  // Read the low byte (F5)

            // Combine the two bytes into an integer
            int result = (high << 8) | (low & 0xFF);

            System.out.println("Decoded integer: " + result); // Output 45557
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.