Список <Байт> для Строкового представления, может Вы помогать осуществить рефакторинг этот (маленький) метод?

Если Вы рады использовать классы Apache, Вы могли бы использовать org.apache.commons.text.RandomStringGenerator (текст свободного городского населения).

Пример:

RandomStringGenerator randomStringGenerator =
        new RandomStringGenerator.Builder()
                .withinRange('0', 'z')
                .filteredBy(CharacterPredicates.LETTERS, CharacterPredicates.DIGITS)
                .build();
randomStringGenerator.generate(12); // toUpperCase() if you want

, Так как Ленг свободного городского населения 3.6, RandomStringUtils удерживается от использования.

5
задан Mr_and_Mrs_D 9 September 2013 в 16:34
поделиться

7 ответов

Ваш метод - практически единственный способ сделать это. Вы можете найти внешнюю библиотеку, которая выполняет ее полностью или частично, но по сути она будет делать то же самое.

Однако в вашем коде есть одна вещь, которая представляет собой потенциальную проблему: при вызове new String (array ) , вы используете кодировку платформы по умолчанию для преобразования байтов в символы. Кодировка платформы различается в зависимости от операционной системы и настроек локали - ее использование почти всегда является ожидаемой ошибкой. Это зависит от того, откуда вы получаете эти байты, но их кодировка должна быть где-то указана, передана в качестве аргумента методу и использована для преобразования (с помощью конструктора String со вторым параметром).

8
ответ дан 13 December 2019 в 19:33
поделиться
import org.apache.commons.lang.ArrayUtils;

...

Byte[] bytes = new Byte[l.size()];
l.toArray(bytes);

byte[] b =  ArrayUtils.toPrimitive(bytes);
3
ответ дан 13 December 2019 в 19:33
поделиться

без какой-либо дополнительной библиотеки (например, apache commons) ваш метод в порядке

1
ответ дан 13 December 2019 в 19:33
поделиться

Вы могли бы использовать java.nio и придумать что-то вроде этого

public static String byteListToString(List<Byte> l, Charset cs)
throws IOException
{
    final int CBUF_SIZE = 8;
    final int BBUF_SIZE = 8;

    CharBuffer cbuf = CharBuffer.allocate(CBUF_SIZE);
    char[] chArr = cbuf.array();
    ByteBuffer bbuf = ByteBuffer.allocate(BBUF_SIZE);
    CharsetDecoder dec = cs.newDecoder();
    StringWriter sw = new StringWriter((int)(l.size() * dec.averageCharsPerByte()));

    Iterator<Byte> itInput = l.iterator();
    int bytesRemaining = l.size();
    boolean finished = false;
    while (! finished)
    {
        // work out how much data we are likely to be able to read
        final int bPos = bbuf.position();
        final int bLim = bbuf.limit();
        int bSize = bLim-bPos;
        bSize = Math.min(bSize, bytesRemaining);
        while ((--bSize >= 0) && itInput.hasNext()) 
        {
            bbuf.put(itInput.next().byteValue());
            --bytesRemaining;
        }
        bbuf.flip();
        final int cStartPos = cbuf.position();
        CoderResult cr = dec.decode(bbuf, cbuf, (bytesRemaining <= 0));
        if (cr.isError()) cr.throwException();
        bbuf.compact();
        finished = (bytesRemaining <= 0) && (cr == CoderResult.UNDERFLOW);
        final int cEndPos = cbuf.position();
        final int cSize = cEndPos - cStartPos;
        sw.write(chArr, cStartPos, cSize);
        cbuf.clear();
    }
    return sw.toString();
}

, но я действительно не думаю, что рекомендовал бы что-то настолько простое.

0
ответ дан 13 December 2019 в 19:33
поделиться

Незначительный параметр:

if (l == null || l.isEmpty() ) {
    return "" ;
}

, чтобы избежать создания пустых строк для пустых списков.

1
ответ дан 13 December 2019 в 19:33
поделиться

Одним из вариантов может быть использование StringBuilder:

public static String byteListToString(List<Byte> l) {
    if (l == null) {
        return "" ;
    }
    StringBuilder sb = new StringBuilder(l.size());

    for (Byte current : l) {
        sb.append((char)current);
    }

    return sb.toString();
}

Или, если вам нужно преобразование символов

public static String byteListToString(List<Byte> l) {
    if (l == null) {
        return "" ;
    }
    ByteArrayOutputStream bout = new ByteArrayOutputStream(l.size());

    for (Byte current : l) {
        bout.write(current);
    }

    return bout.toString("UTF-8");
}

Если вы агрегируете байты, попробуйте сначала ByteArrayOutputStream вместо Список байтов. Примечание. Не упустите исключение UnsupportedEncodingException - вам нужно где-нибудь попытаться его отловить.

-1
ответ дан 13 December 2019 в 19:33
поделиться

Обратите внимание на класс BitConverter , я думаю, он делает то, что вы хотите. Используйте его в сочетании с методом List.toArray ().

-2
ответ дан 13 December 2019 в 19:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: