문자열에 를 목록에,이 (작은) 방법을 Refactor에 도울 수 있습니까?

StackOverflow https://stackoverflow.com/questions/1096868

  •  11-09-2019
  •  | 
  •  

문제

우리는이 작은 유틸리티 방법을 사용합니다. 그러나 우리는 그것을 좋아하지 않습니다. 그다지 중요하지 않기 때문에 (어쨌든 작동합니다 ...), 우리는 그것을 잊었습니다.
그러나 그것은 우리가 전체 배열을 통과해야하기 때문에 추악합니다. Byte[] 에게 byte[].
내가 찾고 있어요 :

  • 캐스팅하는 방법을 위해 Byte[] 안에 byte[] 통과하지 않고
  • 또는 문자열에 목록을 캐스팅하는 유틸리티 메소드

public static String byteListToString(List<Byte> l, Charset charset) {
    if (l == null) {
        return "";
    }
    byte[] array = new byte[l.size()];
    int i = 0;
    for (Byte current : l) {
        array[i] = current;
        i++;
    }
    return new String(array, charset);
}
도움이 되었습니까?

해결책

당신의 방법은 그것을하는 유일한 방법입니다. 당신은 그것의 전부 또는 일부를 수행하는 외부 라이브러리를 찾을 수 있지만, 본질적으로 같은 일을 할 것입니다.

그러나 코드에는 잠재적 인 문제인 한 가지가 있습니다. new String(array), 플랫폼 기본 인코딩을 사용하여 바이트를 문자로 변환합니다. 플랫폼 인코딩은 운영 체제와 로케일 설정마다 다릅니다.이를 사용하는 것은 거의 항상 버그가 발생하기를 기다리는 버그입니다. 바이트를 얻는 위치에 따라 다르지만 인코딩은 어딘가에 지정되어야하며, 방법에 인수로 전달되고 (문자열 생성자를 두 번째 매개 변수와 함께 사용하여) 변환에 사용됩니다.

다른 팁

import org.apache.commons.lang.ArrayUtils;

...

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

byte[] b =  ArrayUtils.toPrimitive(bytes);

추가 라이브러리 (예 : Apache Commons)가 없으면 방법이 괜찮습니다.

작은 NIT :

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

빈 목록을위한 빈 줄을 생성하지 않기 위해.

구아바 많은 유용한 것을 제공합니다 원시적 유틸리티,, a Bytes 컬렉션에서 이것과 다른 작업을하는 클래스 Byte사소한.

private static String toString(List<Byte> bytes) {
  return new String(Bytes.toArray(bytes), StandardCharsets.UTF_8);
}

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();
}

그러나 나는이 단순한 것을 추천 할 것이라고 생각하지 않습니다.

하나의 옵션은 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을 조심하십시오. 어딘가에 그것을 시도해야합니다.

확인하십시오 비트 컨버터 수업, 나는 그것이 당신이 원하는 것을하는 것 같아요. list.toArray () 메소드와 함께 사용하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top