سلسلة قاعدة 64 فك أون-غزيبد من ليتل إنديان 4 بايت إنت إلى جافا إنت

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

سؤال

أحاول تنفيذ ملفات تمكس في الروبوت وكنت آمل شخص يمكن أن تساعد.بناء على دليل تمكس, ، من أجل الحصول على دائرة المخابرات العامة لا بد لي من

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

أعتقد أنني قد أحسب قاعدة 64 فك و 'غونزيب' ولكن النتيجة من التعليمات البرمجية أدناه هو 27 ، 0 ، 0 ، 0 تكرار.أعتقد أنه من المفترض أن يكون الإخراج

(0,0) (1,0) (2,0) (3,0) (0,1) (1,1) (2,1) (3,1) (0,2) (1,2) (2,2) (3,2)

شكراً!

 public static void main( String[] args )
 {
 String myString = "H4sIAAAAAAAAAO3NoREAMAgEsLedAfafE4+s6l0jolNJiif18tt/Fj8AAMC9ARtYg28AEAAA";

 byte[] decode = Base64.decodeBase64(myString);

 ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(decode); 
 GZIPInputStream gzipInputStream;

 int read;
 try
 {
      gzipInputStream = new GZIPInputStream(byteArrayInputStream);

      InputStreamReader inputStreamReader = new InputStreamReader(gzipInputStream);
      BufferedReader bufferedReader = new BufferedReader(inputStreamReader, 4);

      while ( ( read = bufferedReader.read() ) != -1 )
      {
           System.out.println("read :" + read);
      }
 }
 catch (IOException e)
 {
      e.printStackTrace();
 }
 }
هل كانت مفيدة؟

المحلول

لا تستخدم Readerلأي شيء سوى بيانات الشخصية!

استخدام DataInput لقراءة الأعداد الصحيحة.تزيين الخاص بك GZIPInputStream مع DataInputStream واستخدام readInt.

إذا كانت إنتس قليلا إنديان ، سوف تحتاج إلى عكس ترتيب بايت للنوع.يستخدم جافا ترتيب بايت الشبكة (كبير-إنديان).بالنسبة للأعداد الصحيحة ، يمكن القيام بذلك باستخدام عدد صحيح.ريفيربيتس.

يمكنك طباعة القيم السداسية باستخدام:

System.out.format("%08x", (int) n);

كيف تقرأ كل شيء int القيم من تيار من الطول التعسفي:

تتمثل إحدى الآليات في استخدام available() الطريقة التي التقديرات عدد البايتات المتبقية:

byte[] ints = {0x00, 0x00, 0x00, (byte) 0xFF,
               (byte) 0xAA, (byte) 0xBB, (byte) 0xEE, (byte) 0xFF};
ByteArrayInputStream array = new ByteArrayInputStream(ints);
DataInputStream data = new DataInputStream(array);
while(data.available() > 0) {
  int reversed = Integer.reverseBytes(data.readInt());
  System.out.format("%08x%n", reversed);
}

في الحالة العامة, available() ليست آلية موثوقة.ولكن يمكنك زيادة البث الخاص بك باستخدام مخزن مؤقت للتحقق من توفر البيانات:

  public static void main(String[] args) throws IOException {
    byte[] ints = {0x00, 0x00, 0x00, (byte) 0xFF,
                    (byte) 0xAA, (byte) 0xBB, (byte) 0xEE, (byte) 0xFF};
    ByteArrayInputStream array = new ByteArrayInputStream(ints);
    BufferedInputStream buffer = new BufferedInputStream(array);
    DataInputStream data = new DataInputStream(buffer);
    while(hasData(data)) {
      int reversed = Integer.reverseBytes(data.readInt());
      System.out.format("%08x%n", reversed);
    }
  }

  public static boolean hasData(InputStream in) throws IOException {
    in.mark(1);
    try {
      return in.read() != -1;
    } finally {
      in.reset();
    }
  }

نصائح أخرى

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