java - 具有负值的字节数组转换为字符串时是否会丢失信息?

标签 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){
 ...

最佳答案

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

此外,您应该非常很少使用默认平台编码,这是您调用 String.getBytes()new String( byte[]) 而不指定编码。

一般来说,加密将二进制数据转换为二进制数据。因此,将字符串加密为字符串的正常过程是:

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

Base64 用于以无损方式将任意二进制数据编码为 ASCII 数据。解密只需颠倒以下步骤即可:

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

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

关于java - 具有负值的字节数组转换为字符串时是否会丢失信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17322825/

相关文章:

python - 使用python替换字符串中字符的所有实例

c - 字符串处理 C linux 和 windows

java - 实参 int 无法通过方法调用转换转换为 byte

java - java中的相对频率

java数组,执行正数和负数

java - log4j.properties 在可执行 jar 中不起作用

c# - 您如何检查字符串列表是否与您的短语中的所有单词匹配?

Java——如何从输入流(套接字/套接字服务器)中读取未知数量的字节?

c++ - 使用奇数位大小的 union

java - 通过 id 获取枚举 [JAVA]