قائمة إلى String، هل يمكنك المساعدة في إعادة تكوين هذه الطريقة (الصغيرة)؟

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) طريقة جيدة

قاصر NIT:

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

لتجنب إنشاء سلاسل فارغة لقوائم فارغة.

جوجا يوفر عددا من مفيد المرافق البدائية, ، بما في ذلك Bytes الطبقة التي تجعل هذا وغيرها من العمليات على مجموعات ByteS تافهة.

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

إذا كنت تجميع بايت، فحاول bytearrayoutputtream في المقام الأول بدلا من قائمة البايتات. ملاحظة: احترس من unsupportedencodingException - ستحتاج إلى تجربة ذلك في مكان ما.

تفحص ال bitconverter. فئة، أعتقد أنه يفعل ما تريد. استخدمه بالاشتراك مع الأسلوب List.toarray ().

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top