डार्ट टाइपडाटा और बड़ा / थोड़ा एंडियन प्रतिनिधित्व
यदि मैं निम्नलिखित कोड चलाता हूं:
Uint8List bytes = Uint8List.fromList([1, 0, 0, 128]);
ByteBuffer byteBuffer = bytes.buffer;
Uint16List sixteenBitList = byteBuffer.asUint16List();
print(sixteenBitList);
मुझे निम्नलिखित परिणाम मिले:
[1, 32768]
चूंकि मूल मूल्य थे
00000001 00000000 00000000 10000000
1 0 0 128
मुझे उम्मीद है कि उन्हें इस तरह से जोड़ा जाएगा:
0000000100000000 0000000010000000
256 128
इसके बजाय, मुझे यह मिला:
0000000000000001 1000000000000000
1 32768
वह छोटा सा एंडियन है ना? मैं अपने मैक पर इस कोड को चला रहा हूं। क्या कारण है कि मुझे ऊपर परिणाम मिला क्योंकि मेरा मैक थोड़ा एंडियन का उपयोग करता है? अगर मैं एक बड़े एंडियन कंप्यूटर पर समान कोड चलाता हूं, तो क्या यह एक अलग परिणाम देगा? (मुझे डार्टपैड पर एक ही परिणाम मिलता है, लेकिन मुझे नहीं पता कि डार्टपैड किस मशीन पर चल रहा है।)
जवाब
हां यह एक अलग परिणाम देने की उम्मीद होगी। आप एक बड़े एंडियन सिस्टम पर अपना अपेक्षित परिणाम प्राप्त करेंगे। आपके बाइट डेटा को देखने की आपकी वर्तमान पद्धति होस्ट सिस्टम की समाप्ति का उपयोग करती है। इसमें डार्टपैड भी शामिल है क्योंकि डार्टपैड में चल रहे कोड को जेएस के लिए संकलित किया जा रहा है, जो अभी भी उसी छोटे एंडियन सिस्टम पर चल रहा है।
डार्ट भाषा के लिए कोई सेट एंडियनस नहीं है। हालाँकि, बाइट डेटा को देखने के कुछ तरीके स्पष्ट रूप से ByteData
कक्षा की तरह एक स्थायीता निर्धारित करते हैं ।
क्रिस्टोफर मूर के जवाब के बारे में कुछ अतिरिक्त जानकारी यहाँ दी गई है।
आप निम्न के साथ अपने कंप्यूटर की समाप्ति की जांच कर सकते हैं:
print(Endian.host == Endian.little);
अधिकांश व्यक्तिगत कंप्यूटर थोड़ा एंडियन आर्किटेक्चर का उपयोग करते हैं ताकि आमतौर पर वापस आ जाए true
।
आप उस एंडियननेस को निर्दिष्ट कर सकते हैं जिसके साथ आप डेटा का उपयोग करके देखना चाहते ByteData
हैं BytesBuffer
:
import 'dart:typed_data';
void main() {
Uint8List byteList = Uint8List.fromList([1, 0, 0, 128]);
ByteData byteData = ByteData.sublistView(byteList);
int value = byteData.getUint16(0, Endian.big);
print(value.toRadixString(2).padLeft(16, '0'));
value = byteData.getUint16(2, Endian.big);
print(value.toRadixString(2).padLeft(16, '0'));
}
परिणाम है:
0000000100000000 0000000010000000
आप को बदलते हैं Endian.big
करने के लिए Endian.little
परिणाम होगा:
0000000000000001 1000000000000000
यहां आप इस बारे में और अधिक पढ़ सकते हैं:
- डार्ट में बाइट्स के साथ काम करना