【问题标题】:Convert Java string to byte array将Java字符串转换为字节数组
【发布时间】:2011-07-26 21:00:20
【问题描述】:

我有一个字节数组,我正在对其进行加密,然后将其转换为字符串以便传输。当我收到字符串时,我必须将字符串转换回字节数组,以便对其进行解密。我检查了接收到的字符串是否与发送的字符串匹配(包括长度),但是当我使用 str.getBytes() 之类的东西将其转换为字节数组时,它与我原来的字节数组不匹配。

示例输出:

SENT: WzShnf/fOV3NZO2nqnOXZbM1lNwVpcq3qxmXiiv6M5xqC1A3
SENT STR: [B@3e4a9a7d
RECEIVED STR: [B@3e4a9a7d
RECEIVED: W0JAM2U0YTlhN2Q=

有什么想法可以将接收到的字符串转换为与发送的字节数组匹配的字节数组吗?

谢谢

【问题讨论】:

  • 为了将字符串转换为字节数组,请使用: String stringToConvert = "此字符串长度为 76 个字符,将被转换为字节数组"; byte[] theByteArray = stringToConvert.getBytes();
  • W0JAM2U0YTlhN2Q= 是 [B@3e4a9a7d 的 Base64,它看起来像 Java 中字节数组的字符串表示形式。如果您自己执行字节操作,请仔细检查,因为您可能发送了错误的数据。
  • out 是我的字节数组,打印时给出了我的示例输出的第一行。 out.toString() 绝对给了我 [B@3e4a9a7d
  • 看看代码(部分)会有帮助

标签: java string encoding bytearray


【解决方案1】:

你使用了array.toString(),它是这样实现的:

return "[B@" + Integer.toString(this.hashCode(), 16);

(实际上它继承了Object的定义,@之前的部分就是getClass().getName()的结果。)

而且这里的hashCode不依赖于内容。

改为使用 new String(array, encoding)。

当然,这仅适用于真正可表示为 Java 字符串(然后包含可读字符)的字节数组,不适用于任意数组。最好像 Bozho 推荐的那样使用 base64(但请确保在通道的两侧都使用它)。

【讨论】:

  • 谢谢,这是解决问题的快速方法
【解决方案2】:

这看起来像 Base64。看看commons-codecBase64类。

【讨论】:

  • 我确实尝试过使用 sun.misc.BASE64Decoder,我认为它非常相似,但它似乎对我不起作用
  • @Mitch 尝试string.getBytes("ISO-8859-1"),然后将其作为构造函数参数传递。
  • @Mitch 不使用来自sun.* 包的任何类。它们是专有 API,可以随时删除。使用任何其他公共实现,例如 Bozho 建议的。
【解决方案3】:

您不能只在两台不同的机器上使用 getBytes(),因为 getBytes 使用平台的默认字符集。

使用指定的字符集(即 UTF-8)对数组进行解码和编码,以确保获得正确的结果。

【讨论】:

    【解决方案4】:

    首先将字节数组转换为正确的字符串,方法是

    String line= new String(Arrays.toString(your_array))
    

    然后发送并使用下面的功能

    public static byte[] StringToByteArray(String line)
    {
    
        String some=line.substring(1, line.length()-1);     
        int element_counter=1;
    
        for(int i=0; i<some.length(); i++)
        {           
            if (some.substring(i, i+1).equals(","))
            {
                element_counter++;
            }       
    
        }
        int [] comas =new int[element_counter-1];
        byte [] a=new byte[element_counter];
        if (a.length==1)
        {
            a[0]= Byte.parseByte(some.substring(0));
        }       
        else 
        {
            int j=0;
            for (int i = 0; i < some.length(); i++) 
            {
                if (some.substring(i, i+1).equals(","))
                {
                    comas[j]=i;
                    j++;
                }
            }           
            for (int i=0; i<element_counter; i++)
            {
                if(i==0)
                {
                    a[i]=Byte.parseByte(some.substring(0, comas[i]));
                }
                else if (i==element_counter-1)
                {
                    a[i]=Byte.parseByte(some.substring(comas[comas.length-1]+2));
                }
                else
                {
                    a[i]=Byte.parseByte(some.substring(comas[i-1]+2, comas[i]));
                }
    
            }
        }
        return a;
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-06
      • 2013-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-21
      相关资源
      最近更新 更多