java - जावा से गलत बाइट्स सी की तुलना में सी#




c# binary (2)

इसलिए मेरे पास कुछ FRX बाइनरी फ़ाइलें हैं जिनमें से मैं जावा की बाइनरी रीडिंग विधियों का उपयोग कर स्ट्रिंग कैप्शन प्राप्त करने का प्रयास कर रहा हूं।

मैं ऐसा करने में सक्षम था, और उस क्षेत्र को निर्दिष्ट करने के लिए जिसमें निम्नलिखित प्रोग्राम का उपयोग करके सी # में बाइट्स पढ़ने की है:

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

    public class GetFromFRX
    {
        public static void Main()
        {
            StringBuilder buffer = new StringBuilder();
            using (BinaryReader b = new BinaryReader(File.Open("frmResidency.frx", FileMode.Open)))
            {
                try
                {
                    b.BaseStream.Seek(641, SeekOrigin.Begin);
                    int length = b.ReadInt32();

                    for (int i = 0; i < length; i++)
                    {
                        buffer.Append(b.ReadChar());
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine( "Error obtaining resource\n" + e.Message);
                }

            }
            Console.WriteLine(buffer);
        }
    }

प्रश्न अद्यतन: जावा में ऐसा करने का प्रयास करते हुए, मैंने निम्नलिखित प्रोग्राम का निर्माण किया है अब मैंने LittleEndian समकक्षों का उपयोग करने के लिए LittleEndian को लागू किया है, हालांकि अब मेरी लंबाई 24 प्रिंट है, और नतीजतन, मैं अपनी आउटपुट फाइल में केवल 24 बाइट्स प्राप्त करता हूं। क्या इस स्थिति के लिए ReadInt उपयुक्त नहीं है, और ReadInt32 तुलना में एक अलग तरीके से ReadInt32 ?

import java.io.*;
import com.google.common.io.*;

public class RealJavaByteReader {

    public static void main(String[] args) throws IOException {

        FileInputStream in = null;
        FileOutputStream out = null;

        try {
            in = new FileInputStream("frmResidency.frx");
            LittleEndianDataInputStream din = new LittleEndianDataInputStream(in);
            out = new FileOutputStream("output.txt");

            int length = din.readInt();
            System.out.println(length);
            int c;

            for (c = 0; c < length; c++) {
                // TODO: first read byte and check for EOF
                out.write(din.read());
            }
        } finally {
            if (in != null) {
                in.close();
            }
            if (out != null) {
                out.close();
            }
        }
    }
}

मुझे एहसास हुआ कि इस समय मेरी गलती क्या थी। अब कि LittleEndianDataInputStream लागू किया गया है, मैं अपनी प्रारंभिक बाइट स्थिति सेट करने के लिए सही ढंग से SkipBytes का उपयोग कर सकता हूं और आवश्यकतानुसार स्ट्रिंग कैप्शन वापस लौटा देगा। बेशक मैं शुरू में केवल पहले 24 बाइट्स का उत्पादन करेगा, क्योंकि बाइनरी फ़ाइल के पहले 4 बाइट्स में जो कुछ है वह FRX फ़ाइल में कुछ दिए गए प्रॉपर्टी के लिए 24 की लंबाई रखना होगा। मुझे सार्थक कुछ भी उत्पादन करने के लिए skipBytes साथ ओफ़्सेट सेट करना होगा, क्योंकि FRX फ़ाइलों में गुणों की लंबाई 4 बाइट्स के समूह में संग्रहित की जाती है और उन गुणों वाले उन बाइट्स द्वारा पीछा किया जाता है।

उदाहरण के लिए, अगर मैं din.skipBytes(308); सेट करता din.skipBytes(308); , तो FRX फ़ाइल में 308 से 312 वें बाइट्स को कैप्शन प्रॉपर्टी में स्ट्रिंग की बाइट-लम्बाई है जिसे मुझे आवश्यकता है (उदाहरण के लिए 140), जो कि readInt द्वारा आउटपुट है। इस प्रकार अगले 140 बाइट्स में मेरी स्ट्रिंग की आवश्यकता होगी, और मेरी लूप के for ठीक से पुनरावृत्त होगा।


Elizion,

यह शायद इसलिए हो सकता है कि आप थोड़ा एंडियन के उपयोग से एक इंट संग्रह पढ़ रहे हों जैसे, जावा बिग एंडियन और। NET थोड़ा एंडियन का उपयोग करता है।

जावा में एक बड़ा endian int को थोड़ा endian int बदलने के लिए नीचे के रूप में एक फ़ंक्शन का उपयोग करें।

/**
   * Byte swap a single int value.
   * 
   * @param value  Value to byte swap.
   * @return       Byte swapped representation.
   */
  public static int swap (int value)
  {
    int b1 = (value >>  0) & 0xff;
    int b2 = (value >>  8) & 0xff;
    int b3 = (value >> 16) & 0xff;
    int b4 = (value >> 24) & 0xff;

    return b1 << 24 | b2 << 16 | b3 << 8 | b4 << 0;
  }

कृपया नीचे दिए गए पोस्ट को देखने का प्रयास करें

बिल्ट एंडियन के लिए लिटिल एंडियन को परिवर्तित करना





fileinputstream