将List <byte>转换为字符串

时间:2016-07-02 14:22:37

标签: java list arraylist byte

我有以下代码:

List<String> decryptedPasswordInPairs = new ArrayList<String>();
String A5 = "A5";
for (String oddPair : oddPairsInEncryptedPassword) {
    List<Byte> sample = new ArrayList<>();
    for (int i = 0; i < oddPair.length(); i++) {
        byte x = (byte) (oddPair.charAt(i) ^ A5.charAt(i % A5.length()));
        sample.add(x);
    }
    String result = sample.toString();
    decryptedPasswordInPairs.add(result);
}

在此代码中,当我调试程序以检查result的值时,[0,7]显示为07而不是result

有没有办法将List Byte String转换为 <activity android:name=".HistoryActivity" android:label="History" android:theme="@style/AppTheme.Primary"></activity> 而没有任何问题?

4 个答案:

答案 0 :(得分:2)

在这个解决方案中,我收集StringBuilder中的字符并在最后转换为String:

List<String> decryptedPasswordInPairs = new ArrayList<String>();
    String A5 = "A5";

    List<String> oddPairsInEncryptedPassword = new LinkedList<String>();
    oddPairsInEncryptedPassword.add("A2");

    for (String oddPair : oddPairsInEncryptedPassword) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < oddPair.length(); i++) {
            byte x = (byte) (oddPair.charAt(i) ^ A5.charAt(i % A5.length()));
            sb.append(""+x);
        }

        String result = sb.toString();
        System.out.println(result);
        decryptedPasswordInPairs.add(result);
    }

答案 1 :(得分:2)

如果您愿意使用第三方库,则以下解决方案可以使用Eclipse Collections

MutableList<String> decryptedPasswordInPairs = Lists.mutable.with("A2")
    .collectWith((oddPair, A5) ->
            CharAdapter.adapt(oddPair)
                .injectIntoWithIndex(
                    ByteLists.mutable.empty(),
                    (bytes, character, index) ->
                        bytes.with((byte) (character ^ A5.charAt(index % A5.length()))))
                .makeString(""), "A5");
decryptedPasswordInPairs.each(System.out::println);

我使用了以下导入:

import org.eclipse.collections.api.list.MutableList;
import org.eclipse.collections.impl.factory.Lists;
import org.eclipse.collections.impl.factory.primitive.ByteLists;
import org.eclipse.collections.impl.string.immutable.CharAdapter;

通过使用Eclipse Collections中提供的原始ByteList,我能够避免装箱。 makeString上提供的方法ByteList允许您控制分隔符。传入空String会删除toStringList使用的逗号。课程CharAdapter围绕char提供了一组基于String的协议,其中包括我在此处使用的名为injectIntoWithIndex的方法。

代码也可以分成更小的步骤,使其密度稍低,并且可能更容易阅读。

MutableList<String> decryptedPasswordInPairs = Lists.mutable.with("A2")
    .collect(CharAdapter::adapt)
    .collectWith((oddPair, A5) ->
        oddPair.injectIntoWithIndex(
            ByteLists.mutable.empty(),
            (bytes, character, index) ->
                bytes.with((byte) (character ^ A5.charAt(index % A5.length())))), "A5")
    .collectWith(ByteList::makeString, "");
decryptedPasswordInPairs.each(System.out::println);

注意:我是Eclipse Collections的提交者。

答案 2 :(得分:0)

  

result显示为[0,7]而不是07

这是因为您将列表打印为String

你可以摆脱那样做:

for (Byte b : sample) {
    System.out.print(b);
}

或许,但不是很优雅:

String result = sample.toString().replace(",", "").replace("[", "").replace("]", "");
decryptedPasswordInPairs.add(result);

答案 3 :(得分:-1)

将您的列表转换为如下所示的数组。谢谢@ bcsb1001

  

T [] toArray(T [] a)

     

返回包含所有元素的数组   在此列表中以适当的顺序(从第一个元素到最后一个元素);该   返回数组的运行时类型是指定数组的运行时类型。如果   该列表适合指定的数组,在其中返回。   否则,将使用运行时类型分配新数组   指定的数组和此列表的大小。

Byte[] byteArray = sample.toArray(new Byte[0])  

之后,您可以从字节数组创建String。

使用此构造函数:

enter image description here

String str= new String(byteArray, "UTF-8");