كيف يمكنك تحويل البيانات الثنائية إلى السلاسل مرة أخرى في جافا ؟

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

  •  09-06-2019
  •  | 
  •  

سؤال

لدي البيانات الثنائية في ملف أستطيع أن أقرأ إلى صفيف بايت و عملية مع أي مشكلة.الآن أنا في حاجة الى ارسال أجزاء من البيانات عبر شبكة اتصال مثل العناصر في مستند XML.مشكلتي هي أنه عند تحويل البيانات من صفيف من البايت إلى سلسلة والعودة إلى صفيف من البايت البيانات هو الحصول على معطوب.لقد اختبرت هذا على آلة واحدة لعزل المشكلة إلى تحويل سلسلة ، لذلك أنا الآن أعرف أنه ليس الحصول على معطوب من قبل محلل XML أو شبكة النقل.

ما لدي الآن هو

byte[] buffer = ...; // read from file
// a few lines that prove I can process the data successfully
String element = new String(buffer);
byte[] newBuffer = element.getBytes();
// a few lines that try to process newBuffer and fail because it is not the same data anymore

لا أحد يعرف كيفية تحويل ثنائي إلى سلسلة مرة أخرى دون فقدان البيانات ؟

أجاب:شكرا سام.أشعر احمق.كان هذا الرد بالأمس لأن ساكس محلل كان يشتكي.لسبب ما عندما قابلت هذا على ما يبدو قضية منفصلة ، فإنه لم يحدث لي أنه كان عرض جديد من نفس المشكلة.

تحرير:فقط من أجل اكتمال لقد استخدمت Base64 فئة من أباتشي العموم الترميز حزمة لحل هذه المشكلة.

هل كانت مفيدة؟

المحلول

إذا كنت ترميز base64 في هذا سوف تتحول أي بيانات في ascii آمنة النص ، ولكن base64 في ترميز البيانات هو أكبر من orignal البيانات

نصائح أخرى

سلسلة(byte[]) يعامل البيانات الافتراضي ترميز الأحرف.إذا كيف بايت الحصول على تحويلها من 8 بت قيم 16 بت جافا Unicode حرف سوف تختلف ليس فقط بين أنظمة التشغيل ، ولكن يمكن أن تختلف حتى بين مختلف المستخدمين باستخدام مختلف codepages على نفس الجهاز!هذا المنشئ هو جيد فقط فك واحد من ملفات النص الخاص بك.لا تحاول تحويل التعسفي بايت إلى حرف في جافا!

ترميز كما base64 هو حل جيد.هذا هو كيف يتم إرسال الملفات عبر SMTP (e-mail).(مجانا) أباتشي المشاع الترميز المشروع سيتم القيام بهذه المهمة.

byte[] bytes = loadFile(file);          
//all chars in encoded are guaranteed to be 7-bit ASCII
byte[] encoded = Base64.encodeBase64(bytes);
String printMe = new String(encoded, "US-ASCII");
System.out.println(printMe);
byte[] decoded = Base64.decodeBase64(encoded);

وبدلا من ذلك يمكنك استخدام جافا 6 DatatypeConverter:

import java.io.*;
import java.nio.channels.*;
import javax.xml.bind.DatatypeConverter;

public class EncodeDecode {    
  public static void main(String[] args) throws Exception {
    File file = new File("/bin/ls");
    byte[] bytes = loadFile(file, new ByteArrayOutputStream()).toByteArray();
    String encoded = DatatypeConverter.printBase64Binary(bytes);
    System.out.println(encoded);
    byte[] decoded = DatatypeConverter.parseBase64Binary(encoded);
    // check
    for (int i = 0; i < bytes.length; i++) {
      assert bytes[i] == decoded[i];
    }
  }

  private static <T extends OutputStream> T loadFile(File file, T out)
                                                       throws IOException {
    FileChannel in = new FileInputStream(file).getChannel();
    try {
      assert in.size() == in.transferTo(0, in.size(), Channels.newChannel(out));
      return out;
    } finally {
      in.close();
    }
  }
}

ترى هذا السؤال ، كيف يمكنك تضمين البيانات الثنائية في XML ؟ بدلا من تحويل byte[] إلى سلسلة ثم دفع إلى XML في مكان ما, تحويل byte[] إلى سلسلة عبر ترميز BASE64 (بعض XML المكتبات نوع للقيام بذلك بالنسبة لك).BASE64 فك بمجرد الحصول على سلسلة من XML.

استخدام http://commons.apache.org/codec/

كنت قد تكون البيانات فسد بسبب جميع أنواع غريبة الطابع وضع قيود وجود غير بريتينج الشخصيات.عصا w/ BASE64.

كيف يمكنك بناء الخاصة بك XML المستند ؟ إذا كنت تستخدم جافا المضمنة في XML ثم سلسلة ترميز يجب أن يتم التعامل معها بالنسبة لك.

نلقي نظرة على javax.xml و org.xml حزم.هذا ما نستخدمها لتوليد مستندات XML, و أنه يتعامل مع كل سلسلة ترميز وفك ترميز بشكل جيد جدا.

---تعديل:

أعتقد أني أسأت فهم المشكلة.أنت لا تحاول ترميز منتظم السلسلة ، ولكن بعض مجموعة التعسفي الثنائية البيانات ؟ في هذه الحالة ترميز Base64 اقترح في تعليق سابق ربما هو الطريق للذهاب.أعتقد أن هذا المعيار إلى حد ما طريقة ترميز البيانات الثنائية في XML.

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