gpt4 book ai didi

java - 如何在 Java 中将十六进制字符串转换为 ANSI (windows 1252) 并将 ANSI (windows 1252) 转换回十六进制字符串?

转载 作者:行者123 更新时间:2023-12-02 05:57:20 34 4
gpt4 key购买 nike

如何在 Java 中将十六进制字符串转换为 ansi(窗口 1252)以及将 ansi(窗口 1252)转换为十六进制字符串。

python(完美运行)

q = "hex string value"

x = bytes.fromhex(q).decode('ANSI')

a = x.encode("ANSI")
a = a.hex()
if q==a:
print("Correct")

Java(此代码有问题)

String hexOri = "hex string value";
StringBuilder output = new StringBuilder();
for (int i = 0; i < hexOri.length(); i+=2) {
String str = hexOri.substring(i, i+2);
output.append((char)Integer.parseInt(str, 16));
}
System.out.println("ANSI = " + output);
char [] chars = output.toString().toCharArray();
StringBuffer hexOutput = new StringBuffer();

for(int i = 0; i < chars.length; i++){
hexOutput.append(Integer.toHexString((int)chars[i]));
}
System.out.println("HexOutput = " + hexOutput.toString());
System.out.println(hexOri.equals(hexOutput.toString()));

Python 的输出

正确

Python 的预期输出

正确

Java 的输出

错误

Java 的预期输出

正确

最佳答案

在java中,字符串以UTF-16编码,因此您不能简单地读取/写入字符串的字节来获取您想要的编码表示形式。

您应该使用String#getBytes(String str, String charset)将字符串转换为您需要的编码并序列化为字节数组。

必须使用 new String(buffer,encoding) 执行相同的操作来解码字节数组。

在这两种情况下,如果您使用不带字符集的方法,它将使用 JVM 实例的默认编码(应该是系统字符集)。

    public static void main(String[] args) {
String str = "\tSome text [à]";

try {
System.out.println(str); // Some text [à]

String windowsLatin1 = "Cp1252";
String hexString = toHex(windowsLatin1, str);

System.out.println(hexString); // 09536f6d652074657874205be05d

String winString = toString(windowsLatin1, hexString);

System.out.println(winString); // Some text [à]
} catch (UnsupportedEncodingException e) {
// Should not happen.
}

}

public static String toString(String encoding, String hexString) throws UnsupportedEncodingException {
int length = hexString.length();
byte [] buffer = new byte[length/2];
for (int i = 0; i < length ; i+=2) {
String hexVal = hexString.substring(i,i+2);
byte code = (byte) Integer.parseInt(hexVal,16);
buffer[i/2]=code;
}
String winString = new String(buffer,encoding);
return winString;
}

public static String toHex(String encoding, String str) throws UnsupportedEncodingException {
byte[] bytes = str.getBytes(encoding);
StringBuilder builder = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
byte b = bytes[i];
String hexChar = Integer.toHexString(b & 0xff);
if(hexChar.length()<2) {
builder.append('0');
}
builder.append(hexChar);
}
String hexString = builder.toString(); // 09536f6d652074657874205be05d
return hexString;
}

关于java - 如何在 Java 中将十六进制字符串转换为 ANSI (windows 1252) 并将 ANSI (windows 1252) 转换回十六进制字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56000637/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com