当前位置: 首页 > 面试题库 >

'str = new String(bytes,“ UTF8”)'和'bytes = str.getBytes(“ UTF8”)'中的字节数不相同

司马建柏
2023-03-14
问题内容

我可以看到它们与我创建字符串所用的字节不同!我已经使用“ AES / CBC / PKCS5Padding”来获取字符串。

public static void main(String[] args) {

    try {
        int randomNumber = CNStationQueueUtil.randInt(0, 99999);
        String key = "AES_KEY_TAKENUMB";
        byte[] bytes = EncryptHelper.encrypt(key, String.format("%%%d%%%d", 1001, randomNumber));
        String str = new String(bytes, "UTF8");
        System.out.println("str = " + str);
        System.out.println();
        byte[] utf8Bytes = str.getBytes("UTF8");
        printBytes(utf8Bytes, "utf8Bytes");

    } catch (Exception e) {
        e.printStackTrace();
    }

}



public class EncryptHelper {

    public static byte[] encrypt(String key, String value)
            throws GeneralSecurityException {

        byte[] raw = key.getBytes(Charset.forName("UTF-8"));
        if (raw.length != 16) {
            throw new IllegalArgumentException("Invalid key size.");
        }

        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec,
                new IvParameterSpec(new byte[16]));
        return cipher.doFinal(value.getBytes(Charset.forName("UTF-8")));
    }

    public static String decrypt(String key, byte[] encrypted)
            throws GeneralSecurityException {

        byte[] raw = key.getBytes(Charset.forName("UTF-8"));
        if (raw.length != 16) {
            throw new IllegalArgumentException("Invalid key size.");
        }
        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");

        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, skeySpec,
                new IvParameterSpec(new byte[16]));
        byte[] original = cipher.doFinal(encrypted);

        return new String(original, Charset.forName("UTF-8"));
    }
}

问题答案:

当您按原样对字符串进行解码时UTF-8,是因为您将字节编码为UTF-8或兼容格式。您不能只取一个byte[]随机字节并将其转换为字符串,因为它是二进制数据而不是文本。

您可以做的是对二进制文件使用Base64编码器,并使用Base64解码器将其转换回原始字节。

这样做的一种怪癖方法是使用ISO-8859-1,但这通常是个坏主意,因为您会混淆二进制数据和文本数据。



 类似资料:
  • 问题内容: 我有一些来自json文件的文本。在本文中,我应用了UTF8编码,但是该编码器无法识别非标准字符,并且为大写字符,是否有一种方法可以净化我的字符串? 我的功能: 问题答案: 我找到了解决方案。 UTF8采用8位表ASCII表,而UTF16采用16位ASCII表,解决方案很简单,只需将函数修改为:

  • 字节是基本类型字节的实用程序类。 Class 声明 (Class Declaration) 以下是com.google.common.primitives.Bytes类的声明 - @GwtCompatible public final class Bytes extends Object 方法 (Methods) Sr.No 方法和描述 1 static List《Byte》 asList

  • import "bytes" bytes包实现了操作[]byte的常用函数。本包的函数和strings包的函数相当类似。 Examples Buffer Buffer (Reader) Compare Compare (Search) TrimPrefix TrimSuffix const MinRead = 512 MinRead是被Buffer.ReadFrom传递给Read调用的最小尺寸。只

  • 问题内容: 我有以下抛出的非常基本的代码; 我尝试将解码设置为Data变量,如下所示,但是会引发相同的错误; 有什么建议? 问题答案: 您只是将其以错误的顺序放置,是无辜的错误。 (深入解答)。正如wim礼貌地指出的那样,在极少数情况下,他们可以选择UTF-16或UTF-32。在这种情况下,对于开发人员而言,这种情况将不那么常见,在这种情况下,他们将有意识地决定放弃宝贵的带宽。因此,如果遇到编码问

  • Python3 内置函数 描述 bytes 函数返回一个新的 bytes 对象,该对象是一个 0 <= x < 256 区间内的整数不可变序列。它是 bytearray 的不可变版本。 语法 以下是 bytes 的语法: class bytes([source[, encoding[, errors]]]) 参数 如果 source 为整数,则返回一个长度为 source 的初始化数组; 如果

  • Python bytes 类型用来表示一个字节串。“字节串“不是编程术语,是我自己“捏造”的一个词,用来和字符串相呼应。 bytes 是 Python 3.x 新增的类型,在 Python 2.x 中是不存在的。 字节串(bytes)和字符串(string)的对比: 字符串由若干个字符组成,以字符为单位进行操作;字节串由若干个字节组成,以字节为单位进行操作。 字节串和字符串除了操作的数据单元不同之