Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中查找字符串中的字节索引_Java_String - Fatal编程技术网

如何在java中查找字符串中的字节索引

如何在java中查找字符串中的字节索引,java,string,Java,String,我有一个字符串,里面有0x80。字符串表示形式为:serialno�和十六进制表示法是73 65 72 69 61 6C 6E 6F 80。我想从字符串中删除0x80,而不将字符串转换为十六进制字符串。在java中可能吗?我尝试了lastIndexOf(0x80)。但它返回-1 我的代码是(您也可以在上找到): publicstaticvoidmain(字符串[]args){ 字符串hexValue=“73657269616C6E6F80”; 字符串binValue=hexStringToBin

我有一个字符串,里面有
0x80
。字符串表示形式为:
serialno�和十六进制表示法是
73 65 72 69 61 6C 6E 6F 80
。我想从字符串中删除
0x80
,而不将字符串转换为十六进制字符串。在java中可能吗?我尝试了
lastIndexOf(0x80)
。但它返回-1

我的代码是(您也可以在上找到):

publicstaticvoidmain(字符串[]args){
字符串hexValue=“73657269616C6E6F80”;
字符串binValue=hexStringToBin(hexValue);
System.out.println(“binValue:+binValue”);
int index=binValue.lastIndexOf(0x80);
System.out.println(“索引:”+index);
}
公共静态字符串hexStringToBin(字符串s){
int len=s.length();
字节[]数据=新字节[len/2];
对于(int i=0;i数据[i/2]=(字节)((Character.digit(s.charAt(i),16))这对我有用:

int hex = 0x6F;
System.out.println("serialno€".lastIndexOf((char)hex));
输出:

7

这是因为您转换了
符号到十六进制的转换不正确(
0x80
)。
UTF-8
中的1个符号可能需要1个字节或更多。在您的情况下,
符号占用2个字节,并具有以下表示形式
65533
0xFFFD
。因此,如果将代码替换为

int index = variable.lastIndexOf(0xFFFD);
//index will be 8
一切都会好的

证明我的话的代码片段:

String variable = "serialno�";
for (char c : variable.toCharArray())
    System.out.print(((int)c)+ " ");
// 115 101 114 105 97 108 110 111 65533
更新

您在
hexStringToBin
函数中出错。请将其替换为

public static String hexStringToBin(String s) {
    int len = s.length();
    char[] data = new char[len / 2];
    for (int i = 0; i < len; i += 2) {
        data[i / 2] = (char) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i + 1), 16));
    }

    return new String(data);
}
公共静态字符串hexStringToBin(字符串s){
int len=s.length();
字符[]数据=新字符[len/2];
对于(int i=0;i数据[i/2]=(char)((Character.digit(s.charAt(i),16))更改十六进制字符串方法以直接映射到字符

char[] data = new char[len / 2];
for (int i = 0; i < len; i += 2) {
    data[i / 2] = (char) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i + 1), 16));
}

return new String(data);
char[]data=新字符[len/2];
对于(int i=0;i
如果您想说每对字符都映射到相应的字符,例如“80”->char c=0x80;那么您可以通过使用char[]来实现这一点,在创建字符串时不会对其进行编码/解码


如果使用字节[](如您在示例中所做的),则它将被解码,无效字符将映射到0xFFFD,即。

“十六进制表示法为”-您是如何确定的?请提供一个。我怀疑您的字符串实际上包含U+FFFD(Unicode替换字符),但目前还不确定。此外,在将数据转换为字符串之前,最好尽早清理数据。您可能应该在返回
新字符串(数据)时使用字符集
您有一些字节,它们将被翻译成可能与原始字节值具有不同值的字符。一般性意见:不要试图创建这样的字符串来表示任意二进制数据。这不是它的目的。我希望
hextStringTobin
方法返回
字节[]
,而不是
字符串
。在字符
中,0x80
在ASCII表中是未知的。您能告诉我它是哪种编码吗?我尝试了其他两个字节变量,如0x81,0x82…所有变量都表示为65533。但我只查找0x80@user4757345这是因为用于创建字符串的字符集将所有这些值映射到一个invalid字符。
char[] data = new char[len / 2];
for (int i = 0; i < len; i += 2) {
    data[i / 2] = (char) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i + 1), 16));
}

return new String(data);