将byte []转换为String,Send as SMS,将byte []转换为String

时间:2012-03-07 12:56:05

标签: java android sms

我有一些在Java中正常工作的代码,但是当我尝试在Android中使用它时,它遇到了问题。

我正在尝试使用Blowfish算法加密SMS文本消息。

此代码(在android上)的问题是它不接受byte []并且不会解密消息。

发送短信

     sMessage = "hello this is a message"

     byte[] byteArray = EncryptBlowfish(sMessage);  
       //Convert the byte[] into a String which can be sent over SMS
      StringBuffer strb = new StringBuffer();

      for( int x = 0; x<byteArray.length; x++){
      strb.append(byteArray[x]).append(",");
      }//for loop

      sMessage = strb.toString();

(然后通过短信发送sMessage)

收到短信

         //Convert the String back to a byte[] which can be decrypted
        String[] strArray = sMessage.split(",");
        byte[] byteArray = new byte[strArray.length];
        int hold;

        for (int x = 0; x < strArray.length; x++) {
        hold = Integer.parseInt(strArray[x]);
        byteArray[x] = (byte) hold;
    }//for loop

        sMessage = DecryptBlowfish(byteArray);

加密方法

    public static byte[] EncryptBlowfish(String msg){

    byte[] encrypted =null;

    try {


    Cipher cipher = Cipher.getInstance("Blowfish");

    cipher.init(Cipher.ENCRYPT_MODE, secretkey);

    encrypted = cipher.doFinal(msg.getBytes());

    } catch (){ //NoSuchAlgorithmException, NoSuchPaddingException..etc
   }  

    return encrypted;
}

解密方法

        public static String DecryptBlowfish(byte[] msg){
      byte[] decrypted =null;
      try {


       Cipher cipher = Cipher.getInstance("Blowfish");

          cipher.init(Cipher.DECRYPT_MODE, secretkey);


     decrypted = cipher.doFinal(msg);

        } catch (){ //NoSuchAlgorithmException, NoSuchPaddingException..etc
     }  

    return decrypted;
}

消息正在加密,这会创建一个byte [],然后我将byte []转换为字符串,字符串的输出将看起来像这样......

  

46,77,52,11,-108,91,-106,88,-81,-43,14,111,-118,-128,-92,-50,69,-44,100,-94,71 ,92,-49,116,

然后通过SMS发送此输出。然后将字符串转换回byte [] 但是这个字节数组没有解密。

问题:

  1. 为什么这段代码可以在Java应用程序中运行,而不是Android?
  2. 有没有办法让这项工作在Android?
  3. 是否有更好的方法将byte []转换为String并返回。
  4. (如果需要更多信息,请发表评论,谢谢)

3 个答案:

答案 0 :(得分:3)

我认为答案涉及Android与标准Java上的默认字符编码。如果使用msg.getBytes(Charset c)指定字符编码,并解码新的String(byte [],Charset c),会发生什么。

示例:

// String => byte []
byte[] bytes = message.getBytes(Charset.forName("ISO-8859-1"));

// byte [] => String 
String foo = new String(bytes, Charset.forName("ISO-8859-1"));

您可以从以下网址找到可用的字符集:

for (String c : Charset.availableCharsets().keySet()) {
    System.out.println(c);
}

答案 1 :(得分:1)

我认为制作字节时存在问题 - &gt; string - &gt;字节转换。尝试发送未加密的字符串并检索它并检查它是否正确。

您应该在每一步指定编码。

答案 2 :(得分:0)

要从字节数组转换为字符串,请使用

Base64.encodeToString(byteArray, Base64.NO_WRAP);

要从字符串转换为字节数组,请使用此

Base64.decode(string, Base64.DEFAULT);

Base64类在android.util包中。