转换为String时,具有负值的字节数组是否会丢失信息?

use*_*818 2 java string byte

我有一个像这样的代码,在编码中我将字母转换为字节,然后用一元按位补码翻转它们〜最后将它转换为字符串.

之后,我想用类似的方法解密它.问题是,对于两个相似的输入字符串(但不相同),我得到具有相同哈希码的相同编码字符串.

String(bytes)方法是否会丢失信息,因为字节是负数,或者我可以以某种方式检索它而不更改我的加密部分?

感谢名单

static String encrypt(String s){
        byte[] bytes=s.getBytes();
        byte[] enc=new byte[bytes.length];

        for (int i=0;i<bytes.length;i++){

            enc[i]=(byte) ~bytes[i];
        }


        return new String(enc);
    }

 static String decrypt(String s){
 ...
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 7

永远不应该使用new String(...)编码任意二进制数据.这不是它的用途.

此外,你应该只非常罕见使用默认的平台编码,也就是当你调用你所得到的String.getBytes(),并new String(byte[])没有指定的编码.

通常,加密将二进制数据转换为二进制数据.因此,将字符串加密为字符串的正常过程是:

  • 使用已知编码将字符串转换为字节(例如UTF-8)
  • 加密二进制数据
  • 使用base64将加密的二进制数据转换回字符串.

Base64用于以无损方式将任意二进制数据编码为ASCII数据.解密只是扭转步骤的问题:

  • 将base64文本转换回字节数组
  • 解密字节数组
  • 使用UTF-8将解密的字节数组解码为字符串

(请注意,您目前所拥有的并不是真正的加密 - 它充其量只是混淆.)