【问题标题】:How to convert a String-represented ByteBuffer into a byte array in Java如何在 Java 中将字符串表示的 ByteBuffer 转换为字节数组
【发布时间】:2017-02-02 15:36:15
【问题描述】:

我是 Java 新手,不知道如何执行以下操作:

Scala 应用程序在某处将字符串转换为字节:

ByteBuffer.wrap(str.getBytes)

我将此字节数组收集为 Java String,我希望与上面的 Scala 代码相反,因此得到原始字符串(上面的对象 str)。

ByteBuffer 作为String 开始是我唯一的选择,因为我正在从AWS Kinesis 流中读取它(或者是吗?)。 Scala 代码也不应该改变。

示例字符串:

String str = "AAAAAAAAAAGZ7dFR0XmV23BRuufU+eCekJe6TGGUBBu5WSLIse4ERy9............";

如何在 Java 中实现这一点?

编辑

好的,所以我将尝试详细说明该过程:

  1. 第 3 方 Scala 应用程序生成我需要使用的 CSV 行
  2. 在将这些行存储在 AWS Kinesis 流中之前,应用程序对每一行执行以下操作:

    ByteBuffer.wrap(output.getBytes);
    
  3. 我从流中读取数据作为字符串,字符串可能如下所示:

    String str = "AAAAAAAAAAGZ7dFR0XmV23BRuufU+eCekJe6TGGUBBu5WSLIse4ERy9............";
    
  4. 我需要将上面字符串的内容恢复成原来的可读形式;

我希望我现在已经说得更清楚了,抱歉一开始就让大家感到困惑。

【问题讨论】:

  • 不会像str.toCharArray.map(_.toByte) 这样的东西在Java 中工作吗?
  • 可能,但我不确定我是否理解您在 map(_.toByte) 部分所做的操作
  • “我从流中读取数据作为字符串”——如何?您只是将字节数组传递给String 构造函数,还是使用某种编码,例如base64?
  • 我用谷歌搜索了 aws kinesis,似乎他们对记录进行了 base64 编码。更新了我的答案。
  • 从这里学到的另一个教训:GetShardIteratorResult.getShardIterator() 只返回一个字符串,而 GetRecordsRequest getRecordsRequest = new GetRecordsRequest();getRecords(getRecordsRequest); 获得所需的 ByteBuffer 类型。

标签: java scala


【解决方案1】:

如果您想从byte[] 转到String,请尝试new String(yourBytes)

getBytesString(byte[]) 都使用默认字符编码。


来自Amazon Kinesis Service API Reference

要放入记录的数据 blob,在 blob 序列化时采用 Base64 编码。

您需要对字符串进行 base64 解码。使用 Java 8 它看起来像:

byte[] bytes = Base64.getDecoder().decode("AAAAAAAAAAGZ7dFR0XmV23BR........");
str = new String(bytes, "utf-8"));

其他选项:Base64 Encoding in Java

【讨论】:

  • 我实际上尝试过,如果我的输入不是字节字符串(见上文),这可能会更简单。您的建议只是将字符串视为可读形式的内容。
  • 你能详细说明一下吗?我以为你基本上想要 getBytes 的倒数?
  • 当然:我有一个看起来像这样的字符串:"String str = "AAAAAAAAAAGZ7dFR0XmV23BR"。我知道它已被转换为字节,但我将其作为 String 类型。我想以可读的形式了解这些字节背后的内容
  • 但是"AAAAAAAAAAGZ7dFR0XmV23BR"是怎么产生的?你提到了 getBytes,但这给出了 byte[] 而不是 String。
  • 抱歉,我的问题没有组织。发生的情况是这样的: 1. Scala 应用程序接受一个字符串,执行"getBytes()",将其包装在ByteBuffer 中。 ---> 2. 我将这个 ByteBuffer 作为字符串读取。 ---> 我想知道字符串的最初内容是什么。在一个代码行中,这是对原始字符串所做的:ByteBuffer.wrap(output.getBytes)
【解决方案2】:

我不确定我是否完全理解这个问题,但你是这个意思吗?

String decoded = new String(bytes);

【讨论】:

    【解决方案3】:
    public static void main(String[] args){
        String decoded = new String(bytesData);
        String actualString;
        try{
           actualString = new String(bytesData,"UTF-8");
           System.out.printLn("String is" + actualString);
        }catch(UnsupportedEncodingException e){
           e.printstacktrace();
        }
    }
    

    【讨论】:

    • 您的建议只是将字符串视为可读形式的内容。原始字符串如下所示:String str = "AAAAAAAAAAGZ7dFR0XmV23BR........"
    【解决方案4】:

    对不起,回答错误。 同样,ByteBuffer 是一个 java 类。所以他们可能以同样的方式工作 你需要java版本..

    来自kafka ApiUtils:

    def writeShortString(buffer:ByteBuffer,string:String){
       if(String == null){
           buffer.putShort(-1)
       }
       else{
         val encodedString = string.getBytes(“utf-8”)
         if(encodedString.length > Short.MaxValue){
             throw YourException(Your Message)
         else{
            buffer.putShort(encodedString.length.asInstanceOf[Short])
            buffer.put(encodedString)
       }
      }
    

    }

    【讨论】:

      【解决方案5】:

      对于 Kinesis 数据 blob:

      private CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder();
      decoder.decode(record.getData()).toString();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-28
        • 2021-01-12
        • 2012-09-02
        • 1970-01-01
        • 2012-07-18
        • 2012-03-23
        • 1970-01-01
        相关资源
        最近更新 更多