【问题标题】:java 8 deserialize base64 encoded stringjava 8反序列化base64编码的字符串
【发布时间】:2016-09-24 09:48:53
【问题描述】:

我正在参加夺旗比赛。我坚持的一个问题与 Java 对象的反序列化有关。我正在询问一个 base64 编码的 cookie 字符串。当我解码它时,我相信它是一个 Java 序列化对象,我想反序列化它以改变它们的值并在 base64 中重新编码。

我对java一无所知,我试图反序列化base64解码的字节,但我认为这是错误的类型。

import java.util.Base64;
import java.util.UUID;
import java.io.UnsupportedEncodingException;
import java.io.ObjectInputStream;

public class decode {
   public static void main(String args[]){
      try {

         // Encode using basic encoder
         String base64encodedString = "mybase64encodedstring==";
         System.out.println("Base64 encoded string :" + base64encodedString);

         // Decode
         byte[] base64decodedBytes = Base64.getDecoder().decode(base64encodedString);

         ObjectInputStream in = new ObjectInputStream(base64decodedBytes);
         System.out.println("Deserialised data: \n" + in.readObject().toString());

         System.out.println("Original String: " + new String(base64decodedBytes, "utf-8"));


      }catch(UnsupportedEncodingException e){
         System.out.println("Error :" + e.getMessage());
      }
   }
}

我得到的错误是:

不兼容的类型:byte[] 无法转换为 InputStream

任何帮助表示赞赏!

【问题讨论】:

    标签: java serialization


    【解决方案1】:

    使用 ByteArrayInputStream 代替 ObjectInputStream

    所以,使用这个:

    InputStream in = new ByteArrayInputStream(base64decodedBytes);
    

    改为:

    ObjectInputStream in = new ObjectInputStream(base64decodedBytes);
    

    【讨论】:

    • 有趣的谢谢。然后如何打印反序列化的数据?
    • 实际上我想我找到了如何做到这一点。虽然输出看起来与我使用 base64 解码时相同,即不可打印的 ascii 字符。
    • 任何道路,你的回答对我的问题都是正确的,所以标记为这样。谢谢
    【解决方案2】:

    @Hrabosch 说使用 ByteArrayInputStream 代替。实际上,也可以使用 ByteArrayInputStream

    另外,如果数据是由 ObjectOuputStream 写入的一堆字节,那么从这些字节构造字符串是没有意义的

    像这样

    import java.util.Base64;
    import java.io.ByteArrayInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.ObjectInputStream;
    
    public class Decode {
       public static void main(String args[]){
          try {
    
             // Encode using basic encoder
             // I assume you replace this with actual data...
             String base64encodedString = "mybase64encodedstring==";
             System.out.println("Base64 encoded string :" +    base64encodedString);
    
             // Decode
             byte[] base64decodedBytes = Base64.getDecoder().decode(base64encodedString);
    
             InputStream in = new ByteArrayInputStream(base64decodedBytes);
             ObjectInputStream obin = new ObjectInputStream(in);
             Object object = obin.readObject();
             System.out.println("Deserialised data: \n" + object.toString());
    
             // You could also try...
             System.out.println("Object class is " + object.getClass().toString());
    
             // Don't do this!! The original data was not a string!
             //System.out.println("Original String: " + new     String(base64decodedBytes, "utf-8"));
    
    
          }catch(ClassNotFoundException | IOException e){
             System.out.println("Error :" + e.getMessage());
       }
       }  
    }
    

    【讨论】:

    • 这很有帮助,谢谢。它在尝试输出数据时遇到错误,我会通过它来查看发生了什么,但我的信息在正确的轨道上,所以谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多