在java中编码和解码utf8字符串及其字节

时间:2014-05-06 14:05:13

标签: java string utf-8

我正在开发一个项目,我需要在java中对字符串进行编码和编码。我的字符串是由波斯字符组成的UTF-8字符串。我只想用静态字符xor每个字节,然后用相同的静态字符再次xor它

我写下面的代码,但它完全错误!我用英文字符检查它是否有效

我怎么能解决这个问题,提前谢谢!

    String str = "س";
    char key = 'N';
    byte bKey = (byte) key;

    byte[] b = str.getBytes();

    for (int i = 0; i < b.length; i++)
    {
        b[i] = Byte.valueOf((byte) (b[i] ^ bKey));
    }

    String str1 = new String(b);
    b = str1.getBytes();

    for (int i = 0; i < b.length; i++)
    {
        b[i] = (byte) (b[i] ^ bKey);
    }

    String str2 = new String(b);

3 个答案:

答案 0 :(得分:2)

当您从变异的字节创建str1时,问题就出现了。假设您的默认编码是UTF8,当您说String str1 = new String(b);时,您在这里说的是UTF8编码中的一些字节,请为我构建一个很好的字符串。但是因为你对字节进行了异或,所以编码是无效的UTF8,Java并不知道如何处理它。如果您查看使用b = str1.getBytes();从str1检索的字节,您将看到它们与您创建字符串的字节不同!

真的,你不应该从&#34;废话&#34;创建一个字符串。 bytes ---你真的需要将XOR&#39; d字节存回字符串吗?

如果你真的想这样做,你可以使用单字节编码来欺骗系统,其中所有可能的字节值都是有效的。然后你可以确定你输入字符串的字节与你得到的字节相同。这是一个为我工作的例子:

public class B {
    static public void main(String[] args) throws Exception {
        String str = "س";
        System.out.println(str);
        char key = 'N';
        byte bKey = (byte) key;

        byte[] b = str.getBytes("UTF8");

        System.out.println("Original bytes from str:");
        for (int i = 0; i < b.length; i++) {
            System.out.println(b[i]);
        }

        System.out.println("Bytes used to create str1:");
        for (int i = 0; i < b.length; i++) {
            b[i] = Byte.valueOf((byte) (b[i] ^ bKey));
            System.out.println(b[i]);
        }

        String str1 = new String(b, "Cp1256");

        b = str1.getBytes("Cp1256");

        System.out.println("Bytes retrieved from str1:");
        for (int i = 0; i < b.length; i++) {
            System.out.println(b[i]);
            b[i] = (byte) (b[i] ^ bKey);
        }

        System.out.println("Bytes used to create str2:");
        for (int i = 0; i < b.length; i++) {
            System.out.println(b[i]);
        }

        String str2 = new String(b, "UTF8");
        System.out.println(str2);
    }
}

我得到的输出是:

س
Original bytes from str:
-61
-65
-30
-119
-91
Bytes used to create str1:
-115
-15
-84
-57
-21
Bytes retrieved from str1:
-115
-15
-84
-57
-21
Bytes used to create str2:
-61
-65
-30
-119
-91
س

答案 1 :(得分:1)

当您尝试使用XORed字节创建新的String时会出现问题:

String str1 = new String(b);
b = str1.getBytes();

由于XORed字节不能形成有效的Unicode / UTF-8字符,因此String无效,getBytes()不会返回您的认为。

如果您跳过转换回String,您的代码将正常运行。

答案 2 :(得分:0)

首先,str.getBytes();表示使用默认字符集将字符转换为字节。和String str1 = new String(b);也使用默认字符集。这里没有与UTF-8相关的内容。

在Java中进行位操作有点棘手,尝试将所有b [i]更改为(b [i]&amp; 0xff)。