سلسلة قاعدة 64 فك أون-غزيبد من ليتل إنديان 4 بايت إنت إلى جافا إنت
-
16-09-2020 - |
سؤال
أحاول تنفيذ ملفات تمكس في الروبوت وكنت آمل شخص يمكن أن تساعد.بناء على دليل تمكس, ، من أجل الحصول على دائرة المخابرات العامة لا بد لي من
أول قاعدة 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();
}
}
نصائح أخرى