JavaScript에 바이트 배열 저장

Migel Hewage Nimesha 2024년2월15일
  1. JavaScript의 ArrayBuffer 객체
  2. 유형이 지정된 배열 보기
  3. JavaScript에서 Typed Array View로 ArrayBuffer 조작
JavaScript에 바이트 배열 저장

이 기사에서는 JavaScript에서 바이트 배열을 저장하는 방법에 대해 설명합니다.

JavaScript의 ArrayBuffer 객체

바이트 배열 또는 바이트 배열은 JavaScript에서 ArrayBuffer 개체로 알려져 있습니다. ArrayBuffer는 JavaScript 배열에서 파생되지 않으며 메모리에서 변경할 수 없는 고정 길이를 가집니다.

또한 일반적인 JavaScript 배열에서와 같이 ArrayBuffer 개체의 요소에 직접 액세스할 수 없습니다. 읽기/쓰기를 위해서는 별도의 뷰 객체가 필요합니다.

통사론:

new ArrayBuffer(length_in_bytes);

위의 코드는 지정된 바이트 길이로 새 ArrayBuffer 인스턴스를 생성하기 위해 ArrayBuffer 생성자를 호출합니다.

길이가 8바이트인 ArrayBuuffer를 생성해 보겠습니다.

let myTypedArrayBuffer = new ArrayBuffer(8);

이상적으로는 위의 코드는 8바이트 크기의 새 ArrayBuffer를 생성해야 합니다. 이제 생성된 ArrayBuffer 객체 myTypedArrayBufferbyteLength 속성을 확인합니다.

암호:

console.log(myTypedArrayBuffer.byteLength);

출력:

배열의 byteLength 확인

예상대로 버퍼의 길이는 8바이트입니다. 각 바이트가 0으로 할당되는 메모리에 8바이트를 할당합니다.

이 버퍼는 바이트를 조작하는 메커니즘을 제공하지 않습니다. 따라서 ArrayBuffer에서 읽거나 쓰기 위해 유형이 지정된 배열 보기 객체를 사용해야 합니다.

유형이 지정된 배열 보기

형식화된 배열 보기는 바이트 배열, 특히 메모리에 저장된 ArrayBuffer에 대한 설명을 제공하는 다른 렌즈와 같습니다. 이러한 보기는 부호 있는 정수와 부호 없는 정수 및 부동 소수점과 같은 숫자 유형을 지원합니다.

ArrayBuffer 개체를 조작하기 위해 다음 보기가 구현되었습니다.

유형 설명
Uint8Array 이 보기는 각 바이트가 별도의 정수가 되도록 ArrayBuffer 바이트를 조작합니다. 1바이트는 8비트를 포함하므로 255개의 부호 없는 정수를 표현할 수 있으며 정수 범위는 0에서 255까지입니다.
Uint16Array 이 보기는 버퍼의 모든 2바이트가 0에서 65535 범위의 정수이므로 ArrayBuffer를 제공합니다. 모든 정수는 부호가 없습니다.
Uint32Array ArrayBuffer의 모든 4바이트는 정수로 간주됩니다. 따라서 이 뷰는 40억 개 이상의 부호 없는 숫자를 저장할 수 있습니다.
Float64Array Float64Array는 버퍼의 모든 8바이트를 정수로 해석할 수 있습니다.

보시다시피 다양한 보기를 통해 ArrayBuffer의 이진 데이터를 다른 숫자 형식으로 해석할 수 있습니다.

JavaScript에서 Typed Array View로 ArrayBuffer 조작

위에서 언급한 모든 형식화 배열 보기는 다음과 같은 동일한 생성자 패턴을 따릅니다.

new TypedArray(buffer);              // provides and ArrayBuffer type object
new TypedArray(array_object);        // provides an array-like object
new TypedArray(number_of_elements);  // provides the number of integers to be in
                                     // the typed array
new TypedArray(another_typed_array);  // provides and ArrayBuffer type object
new TypedArray();

JavaScript에는 실제 TypedArray() 생성자가 없습니다. new Uint8Array(), new Float64Array()와 같은 뷰 생성자 중 하나가 됩니다.

이전 예제에서 이미 생성된 ArrayBuffer(myTypedArrayBuffer)를 조작하기 위해 새 Uint8Array 보기를 생성해 보겠습니다.

암호:

let unsigned8BitIntView = new Uint8Array(myTypedArrayBuffer);
console.log(unsigned8BitIntView);

출력:

![ArrayBuffer를 조작하기 위해 새 Uint8Array 만들기](</img/JavaScript/ArrayBuffer.png>를 조작하기 위해 새 Uint8Array 만들기

Uint8Array 유형의 배열 객체는 값 0으로 채워진 모든 바이트로 생성되었습니다.

이 뷰 객체의 길이와 실제 바이트 길이를 검사해 봅시다. 둘 다 8이어야 합니다.

암호:

console.log(
    'Length of the view: ' + unsigned8BitIntView.length +
    '.... Byte length of the view: ' + unsigned8BitIntView.byteLength);

위의 두 값을 얻기 위해 Uint8Array 보기에서 lengthbyteLength 속성을 사용했습니다.

출력:

뷰 객체의 실제 바이트 길이 확인

메모리 버퍼에 값을 쓰자.

unsigned8BitIntView[0] = 200;

이제 각 요소를 반복하여 unsigned8BitIntView 개체를 검사할 수 있습니다.

암호:

for (let value of unsigned8BitIntView) {
  console.log(value);
}

출력:

메모리 버퍼에 값 쓰기

루프 문을 사용하여 unsigned8BitIntView 개체 확인

200 값이 바이트 배열에 저장되었습니다. 바이트 배열에 300을 작성해 봅시다.

unsigned8BitIntView[1] = 300;

위의 예에서와 같이 바이트 배열을 다시 반복합니다.

출력:

루프 문을 사용하여 unsigned8BitIntView 개체 확인_2

출력에 따라 정수 300은 바이트 배열에 기록되지 않았습니다. 이 뷰는 0에서 255 범위의 정수만 쓸 수 있기 때문입니다.

300은 무시되고 대신 44로 작성됩니다. 다음은 정수 44가 생성되는 방법을 보여줍니다.

정수 300은 이진 형식으로 다음과 같이 쓸 수 있습니다.

100101100

이 보기는 8비트 부호 없는 정수를 해석하므로 첫 번째 비트는 생략하고 나머지 8비트를 고려합니다.

00101100

위의 이진 형식은 정수 44입니다. 같은 방식으로 모든 형식화된 배열 보기를 사용하여 기본 ArrayBuffer 또는 메모리의 바이트 배열을 조작할 수 있습니다.

Migel Hewage Nimesha avatar Migel Hewage Nimesha avatar

Nimesha is a Full-stack Software Engineer for more than five years, he loves technology, as technology has the power to solve our many problems within just a minute. He have been contributing to various projects over the last 5+ years and working with almost all the so-called 03 tiers(DB, M-Tier, and Client). Recently, he has started working with DevOps technologies such as Azure administration, Kubernetes, Terraform automation, and Bash scripting as well.

관련 문장 - JavaScript Array