Dart TypedData 및 빅 / 리틀 엔디안 표현

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

리틀 엔디안 맞죠? 이 코드를 Mac에서 실행하고 있습니다. 내 Mac이 리틀 엔디안을 사용하기 때문에 위의 결과를 얻은 이유입니까? 빅 엔디안 컴퓨터에서 동일한 코드를 실행하면 다른 결과가 나올까요? (DartPad에서 동일한 결과를 얻었지만 DartPad가 어떤 시스템에서 실행되고 있는지 모르겠습니다.)

답변

3 ChristopherMoore Dec 20 2020 at 12:03

예, 다른 결과가 나올 것으로 예상됩니다. 빅 엔디안 시스템에서 예상 한 결과를 얻을 수 있습니다. 현재 바이트 데이터를 보는 방법은 호스트 시스템의 엔디안을 사용합니다. 여기에는 DartPad에서 실행되는 코드가 여전히 동일한 리틀 엔디안 시스템에서 실행중인 JS로 컴파일되기 때문에 DartPad가 포함됩니다.

Dart 언어에는 설정된 엔디안이 없습니다. 그러나 바이트 데이터를 보는 일부 방법은 ByteData클래스 와 같은 엔디안을 명시 적으로 설정합니다 .

1 Suragch Dec 28 2020 at 07:10

Christopher Moore의 답변에 대한 추가 정보는 다음과 같습니다.

다음을 사용하여 컴퓨터의 엔디안을 확인할 수 있습니다.

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.bigEndian.little같습니다.

0000000000000001 1000000000000000

여기에서 이에 대한 자세한 내용을 읽을 수 있습니다.

  • Dart에서 바이트 작업