डार्ट टाइपडाटा और बड़ा / थोड़ा एंडियन प्रतिनिधित्व

Dec 20 2020

यदि मैं निम्नलिखित कोड चलाता हूं:

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

वह छोटा सा एंडियन है ना? मैं अपने मैक पर इस कोड को चला रहा हूं। क्या कारण है कि मुझे ऊपर परिणाम मिला क्योंकि मेरा मैक थोड़ा एंडियन का उपयोग करता है? अगर मैं एक बड़े एंडियन कंप्यूटर पर समान कोड चलाता हूं, तो क्या यह एक अलग परिणाम देगा? (मुझे डार्टपैड पर एक ही परिणाम मिलता है, लेकिन मुझे नहीं पता कि डार्टपैड किस मशीन पर चल रहा है।)

जवाब

3 ChristopherMoore Dec 20 2020 at 12:03

हां यह एक अलग परिणाम देने की उम्मीद होगी। आप एक बड़े एंडियन सिस्टम पर अपना अपेक्षित परिणाम प्राप्त करेंगे। आपके बाइट डेटा को देखने की आपकी वर्तमान पद्धति होस्ट सिस्टम की समाप्ति का उपयोग करती है। इसमें डार्टपैड भी शामिल है क्योंकि डार्टपैड में चल रहे कोड को जेएस के लिए संकलित किया जा रहा है, जो अभी भी उसी छोटे एंडियन सिस्टम पर चल रहा है।

डार्ट भाषा के लिए कोई सेट एंडियनस नहीं है। हालाँकि, बाइट डेटा को देखने के कुछ तरीके स्पष्ट रूप से ByteDataकक्षा की तरह एक स्थायीता निर्धारित करते हैं ।

1 Suragch Dec 28 2020 at 07:10

क्रिस्टोफर मूर के जवाब के बारे में कुछ अतिरिक्त जानकारी यहाँ दी गई है।

आप निम्न के साथ अपने कंप्यूटर की समाप्ति की जांच कर सकते हैं:

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

यहां आप इस बारे में और अधिक पढ़ सकते हैं:

  • डार्ट में बाइट्स के साथ काम करना