Java中查找字符串字节索引及移除0x80字符的技术问询
问题分析与解决方案
首先,你遇到的lastIndexOf(0x80)返回-1的核心原因是字符串编码的问题:
当你把包含0x80的字节数组转成String时,你的hexStringToBin方法大概率用了UTF-8编码。但UTF-8中,0x80是一个无效的单字节(UTF-8单字节范围是0x00-0x7F,多字节起始是0xC0及以上),Java的UTF-8解码器会自动把这个无效字节替换成替换字符U+FFFD(就是你看到的�)。这时候你的字符串里根本没有U+0080(也就是int值0x80对应的字符),自然找不到它。
要实现无需转十六进制就移除0x80的需求,你需要先确保字节数组转字符串时,能保留0x80对应的原始字符,再进行移除操作。
具体解决步骤
用ISO-8859-1编码转字节数组为字符串
ISO-8859-1(又称Latin-1)编码会把每个字节直接映射到对应的Unicode码点(0x00-0xFF对应U+0000到U+00FF),这样0x80字节就会被正确转成U+0080字符,而不是替换成�。移除U+0080字符
此时你可以直接用字符串的replace方法,或者通过lastIndexOf找到位置后截取字符串。
修正后的代码示例
import java.nio.charset.StandardCharsets; public class Main { public static void main(String[] args) { String hexValue = "73657269616C6E6F80"; // 十六进制字符串转字节数组 byte[] byteArray = hexToByteArray(hexValue); // 用ISO-8859-1编码转成String,保留原始字节对应的字符 String originalStr = new String(byteArray, StandardCharsets.ISO_8859_1); System.out.println("原始字符串: " + originalStr); // 方法1:直接替换U+0080字符 String cleanedStr1 = originalStr.replace("\u0080", ""); System.out.println("替换后结果: " + cleanedStr1); // 方法2:通过lastIndexOf定位后截取 int targetIndex = originalStr.lastIndexOf(0x80); if (targetIndex != -1) { String cleanedStr2 = originalStr.substring(0, targetIndex); System.out.println("截取后结果: " + cleanedStr2); } } // 实现十六进制字符串转字节数组的工具方法 private static byte[] hexToByteArray(String hexStr) { int length = hexStr.length(); byte[] result = new byte[length / 2]; for (int i = 0; i < length; i += 2) { result[i / 2] = (byte) ((Character.digit(hexStr.charAt(i), 16) << 4) + Character.digit(hexStr.charAt(i + 1), 16)); } return result; } }
额外提醒
如果你之后需要把处理后的字符串转回字节数组,一定要用同样的ISO-8859-1编码,否则会出现字节不匹配的问题。比如:
byte[] cleanedBytes = cleanedStr1.getBytes(StandardCharsets.ISO_8859_1);
内容的提问来源于stack exchange,提问作者utarid
相关产品推荐
相关产品推荐

