DEV Community

Cover image for O que é um ArrayBuffer e como converter seu conteúdo?
Natália Oliveira
Natália Oliveira

Posted on

9

O que é um ArrayBuffer e como converter seu conteúdo?

Estava analisando uma requisição POST em um site e, no formData da requisição, me deparei com um “unable to decode value” em uma das chave-valor. O valor sem decodificação acabou gerando um problema na aplicação que ajudo a desenvolver: não era possível serializar a informação para JSON e esse erro estourava no console do browser.

Acontece que o Chrome não estava decodificando um ArrayBuffer. O ArrayBuffer é um objeto built-in do JavaScript usado para representar algum dado binário com tamanho fixo. O construtor ArrayBuffer() cria um novo ArrayBuffer com um tamanho de bytes fornecido como argumento.

Como não dá para manipular o conteúdo do ArrayBuffer diretamente, podemos criar um TypedArray, um tipo de array para visualizar esses buffers binários e para representá-los num formato específico.

Por exemplo:

const buffer = new ArrayBuffer(8);
const view = new Int32Array(buffer);
Enter fullscreen mode Exit fullscreen mode

O código acima cria um buffer de 8 bytes e depois cria uma view usando o construtor Int32Array, que é um typed array de inteiros com sinal de 32 bits. Só para deixar claro, 8 bytes equivalem a 64 bits.

Como transformar uma string em ArrayBuffer

Podemos, por exemplo, transformar um array de strings em um array com vários ArrayBuffer utilizando o TextEncoder. O TextEncoder basicamente pega a informação e emite uma stream de bytes em UTF-8:

const encoder = new TextEncoder();
const stringsArr = ["xpto", "mock", "10"]
const stringsEncoded = stringsArr.map(string => encoder.encode(string));
const stringsBuffers = stringsEncoded.map(uint8 => uint8.buffer);
Enter fullscreen mode Exit fullscreen mode

O que fizemos acima:

  1. Instanciamos um TextEncoder chamado “encoder”
  2. Criamos um array de strings
  3. Mapeamos o array e chamamos o método encode do nosso encoder para cada string
  4. Com as strings encodadas em Uint8Array, chamamos a propriedade buffer de cada uma delas, retornando o ArrayBuffer referenciado pelo typed array

Teste um console.log(stringsBuffers) no console do seu browser e veja os array buffers no array.

Por que o TextEncoder transforma em Uint8Array?

Os browsers mais comuns não tem mais suporte a outros encodings que não sejam UTF-8. Você pode ler mais sobre isso nessa pergunta do StackOverflow.

Como transformar um ArrayBuffer em uma string

Usando a constante do exemplo anterior:

const decoder = new TextDecoder();
const stringsDecoded = stringsBuffers.map(buffer => decoder.decode(buffer));
Enter fullscreen mode Exit fullscreen mode

O que fizemos acima:

  1. Instanciamos um TextDecoder, que consegue decodificar UTF-8, ISO-8859-2, KOI8-R, GBK, entre outros
  2. Mapeamos nosso array de array buffers e utilizamos o método decode do nosso decoder para cada um

Dê um console.log e veja o resultado.


Fontes:
MDN ArrayBuffer
MDN TypedArray
TextEncoder
TextDecoder
StackOverflow


Esse texto não tem intenção de esgotar o tema. Acrescente nos comentários, e também aponte erros quando os identificar.

SurveyJS custom survey software

JavaScript UI Libraries for Surveys and Forms

SurveyJS lets you build a JSON-based form management system that integrates with any backend, giving you full control over your data and no user limits. Includes support for custom question types, skip logic, integrated CCS editor, PDF export, real-time analytics & more.

Learn more

Top comments (1)

Collapse
 
mulleresposito profile image

Você tem alguma ideia de como manipular o ArrayBuffer que é gerado quando fazemos uma requisição POST e nela temos um FormData contendo campos e arquivos?

dev-to-uploads.s3.amazonaws.com/up...

nextjs tutorial video

Youtube Tutorial Series 📺

So you built a Next.js app, but you need a clear view of the entire operation flow to be able to identify performance bottlenecks before you launch. But how do you get started? Get the essentials on tracing for Next.js from @nikolovlazar in this video series 👀

Watch the Youtube series