/ / क्या zlib की "असम्पीडित" डेटा की मूल अंत्येष्टि को संरक्षित करती है, या क्या यह एक एंडियन रूपांतरण करता है? - zlib, endianness, असम्पीडित

क्या zlib की "असम्पीडित" डेटा की मूल अंतराल को सुरक्षित रखती है, या क्या यह एक एंडियन रूपांतरण करता है? - zlib, endianness, असम्पीडित

मैं विरासत सी ++ कोड के साथ काम कर रहा हूं जो एक्सेस करता हैएक स्क्लाइट डेटाबेस में संपीड़ित दो-बाइट पूर्णांक डेटा। कोड डेटा को निकालने के लिए zlib के असम्पीडित फ़ंक्शन का उपयोग करता है, जो मेरी छोटी-छोटी मशीन पर छोटे-छोटे मूल्यों के रूप में आता है।

इस कोड की संभावना के लिए अनुमति देने के लिएबड़े-एंडियन मशीनों पर पोर्ट किया जाए, मुझे यह जानने की ज़रूरत है कि क्या डेटा हमेशा छोटे-एंडियन ऑर्डर में डिकंप्रेस करेगा, या यदि (इसके बजाय) zlib किसी भी तरह रूपांतरण करेगा।

यह एकमात्र लागू बोली है जिसे मैं ढूंढने में सक्षम हूं (अपनी साइट पर ज़्लिब के एफएक्यू से):

  1. क्या zlib एक बड़े-एंडियन या छोटे-एंडियन आर्किटेक्चर पर काम करेगा, और क्या मैं उनके बीच संपीड़ित डेटा का आदान-प्रदान कर सकता हूं? हाँ और हाँ।

वास्तव में मेरे प्रश्न का उत्तर नहीं देता ... यदि आवश्यक हो तो मैं एंडियन रूपांतरण को संभालने के लिए तैयार हूं। क्या यह मानना ​​सुरक्षित है कि मूल इनपुट डेटा उन्मूलन वह है जिसे आप वापस लाते हैं, भले ही आप जिस प्लेटफॉर्म पर असम्पीडित करते हैं? (मुझे एक बड़ी पहुंच नहीं है वर्तमान में -endian मशीन जिस पर यह स्वयं परीक्षण करने के लिए)।

उत्तर:

जवाब के लिए 2 № 1

zlib संपीड़ित करता है और एक धारा decompressesबाइट्स लापरवाही से। तो जो कुछ भी अंतहीनता में चला गया वह ठीक है। यह पूरी तरह संपीड़न और डिकंप्रेसिंग मशीनों की अंतहीनता के बावजूद है।

एफएक्यू एंट्री इस तथ्य को संदर्भित करता है कि कोड को आर्किटेक्चर के अंतहीनता के लिए असंवेदनशील लिखा गया था जिसे कोड संकलित और चलाने के लिए किया गया है।


उत्तर № 2 के लिए 1

RFC1950 विशेष रूप से बताता है कि कैसे zlib है अपना मेटा-डेटा बहु-बाइट मान संग्रहीत किए जाते हैं:

एक कंप्यूटर के भीतर, एक संख्या एकाधिक पर कब्जा कर सकते हैंबाइट्स। यहां वर्णित प्रारूप में सभी बहु-बाइट संख्या सबसे पहले सबसे महत्वपूर्ण बाइट (निम्न स्मृति पते पर) के साथ संग्रहीत हैं। उदाहरण के लिए, दशमलव संख्या 520 इस प्रकार संग्रहीत है:

         0     1
+--------+--------+
|00000010|00001000|
+--------+--------+
^        ^
|        |
|        + less significant byte = 8
+ more significant byte = 2 x 256

तो बहु-बाइट मूल्यों के संबंध में संचालन अंदर का zlib का उपयोग करें जरूर खाते में endianness ले लो (जो अक्सर पूछे जाने वाले प्रश्न # 26 उत्तर दिया गया है)।

संपीड़ित डेटा स्वयं अपरिवर्तित होगा, क्योंकि ज़्लिब बाइट्स की ग्रैन्युलरिटी के साथ संपीड़ित और डिकंप्रेस करता है, न कि बड़ी इकाइयां।