【问题标题】:Converting a string to byte[] such that the contents remain same将字符串转换为 byte[] 以使内容保持不变
【发布时间】:2012-07-06 15:08:36
【问题描述】:

我有一个字符串说String a = "abc";。现在我想把它转换成一个字节数组比如byte b[];,这样当我打印b时它应该显示“abc”。

我该怎么做? getBytes() 方法给出不同的结果。

到目前为止,我的程序看起来像这样:

String a="abc";
byte b[]=a.getBytes();

我想要的是我在一个类中有两种方法,一种是 公共字节 [] 加密(字符串 a) 另一个是 公共字符串解密(字节[] b) 进行加密后,我将数据保存到数据库中,但是当我取回它时,字节方法没有给出正确的输出,但是我使用字符串方法得到了相同的数据,但是现在我必须将其传递给解密(字节 [] b) 如何做到这一点,这是真实的情况。

【问题讨论】:

  • byte b 永远不会显示“abc”。如果getBytes()不是解决方案,我不明白问题出在哪里。

标签: java


【解决方案1】:

您可以使用this 构造函数重新构建您的字符串:

 String a="abc"; 
 byte b[]=a.getBytes("UTF-8");
 System.out.println(new String(b, "UTF-8"));

除此之外,你不能做System.out.println(b) 并期望看到abc

【讨论】:

  • System.out.println(new String(b, "UTF-8"));这需要关闭。
  • 我的意思是你需要在“UTF-8”之后关闭括号)*这里*;
【解决方案2】:

嗯,您的第一个问题是 Java 中的字符串不是字节数组,而是字符数组,其中每个字符占用 16 位。这是为了覆盖 unicode 字符,而不是只覆盖字节中的 ascii。这意味着如果您使用getBytes 方法,您将无法一次打印一个数组位置的字符串,因为它需要两个数组位置(两个字节)来表示一个字符。

可以做的是使用getChars,然后将每个字符转换为一个字节,并具有相应的精度。这不是一个好主意,因为它不能在普通英文字符之外工作!不过,你问了,所以你去;)

编辑:正如@PeterLawerey 提到的,Unicode 字符使它变得更加困难,一些 unicode 字符需要多个字符。有一个很好的讨论in StackOverflow,它链接到一个详细的article from Oracle

【讨论】:

  • +1 我不会提及超过 16 位codepoints ;)
  • 感谢您让我再次查看! :) 让我在答案中提到它
【解决方案3】:

一个字节是介于-128和127之间的值。当你打印它时,它默认是一个数字。

如果要将其打印为 ASCII 字符,可以将其转换为 (char)

byte[] bytes = "abc".getBytes();
for(byte b: bytes)
    System.out.println((char) b);

打印

a
b
c

【讨论】:

    【解决方案4】:
    byte b[]=a.getBytes();
    System.out.println(new String(b));
    

    【讨论】:

      【解决方案5】:
      1. 这会将“abc”转换为字节,然后代码将以相应的 ASCII 码(即 97 98 99)打印“abc”。

        byte a[]=new byte[160];
        String s="abc";
        a=s.getBytes();
        for(int i=0;i<s.length();i++)
        {
            System.out.print(a[i]+" ");
        }
        
      2. 如果添加这些行,它将再次将 ASCII 代码更改为字符串(即 abc)

        String s1=new String(a);
        System.out.print("\n"+s1);
        

      希望对你有帮助。

      修改后的代码:

      发送字节数组作为参数:

          public static void another_method_name(byte b1[])
          {
              String s1=new String(b1);
              System.out.print("\n"+s1);
          }
          public static void main(String[] args) 
          {
              byte a[]=new byte[160];
              String s="abc";
              a=s.getBytes();
              for(int i=0;i<s.length();i++)
              {
                  System.out.print(a[i]+" ");
              }
              another_method_name(a);
          } 
      

      希望它再次提供帮助。

      【讨论】:

      • 好吧,但我需要包含与 s 中相同的值的字节数组。因为我必须将它作为参数传递给另一个方法。我不能通过 1 x 1 字节我必须将它作为一个整体“abc”以字节的形式传递
      【解决方案6】:

      您似乎正在实施加密和解密代码。 字符串构造函数用于文本数据。你不应该用它来转换字节数组 其中包含加密数据到字符串值。 您应该改用 base64,它将任何二进制数据编码为 ASCII。

      这是一个很好的公共领域

      http://iharder.sourceforge.net/current/java/base64/

      base64 apache 公用

      http://commons.apache.org/codec/download_codec.cgi

      String msg ="abc";
      byte[] data = Base64.decode(msg);
      String convert = Base64.encodeBytes(data);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-14
        • 1970-01-01
        • 1970-01-01
        • 2013-01-17
        • 2015-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多