<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Carlos López</title>
    <description>The latest articles on DEV Community by Carlos López (@clouby).</description>
    <link>https://dev.to/clouby</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F47939%2F6ffa1ca8-5e53-413b-bc12-f5d8a545a089.jpeg</url>
      <title>DEV Community: Carlos López</title>
      <link>https://dev.to/clouby</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/clouby"/>
    <language>en</language>
    <item>
      <title>📝- Buffers en Node.JS</title>
      <dc:creator>Carlos López</dc:creator>
      <pubDate>Sun, 28 Jun 2020 14:47:50 +0000</pubDate>
      <link>https://dev.to/clouby/buffers-en-node-js-3khm</link>
      <guid>https://dev.to/clouby/buffers-en-node-js-3khm</guid>
      <description>&lt;p&gt;En el mundo de la internet y lo que mayor importancia se demuestra al navegar, es la información. En general, en la internet es muy comun aprovechar y proveer diferentes tipos de información, como son imágenes, videos, entre otros.&lt;/p&gt;

&lt;p&gt;A medida que el tiempo pasa, las aplicaciones son más concurrentes, relacionado a toneladas de información, y es sumamente complicado ofrecer toda información de un abrir y cerrar de ojos.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;¿ Pero si lo pensamos de esta forma ? ...&lt;/em&gt; Supongamos que creamos un servicio de alto consumo de información, como lo puede ser un servicio de streaming o subir/bajar archivos de nuestro servicio privado. Tenemos implicaciones más inquietantes cuando hablamos de ...  &lt;em&gt;¿ Como llevamos toda esa información hacia el destino y que no afecte la experiencia ni el consumo alto al momento de hacer un tipo de proceso como presentamos anteriormente ?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Existe algo llamado &lt;code&gt;Buffers&lt;/code&gt; en Node.JS, que se define como:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Los objetos Buffer se usan para representar datos binarios en forma de una secuencia de bytes. Muchas API de Node.js, por ejemplo, flujos y operaciones del sistema de archivos, admiten Buffers, ya que las interacciones con el sistema operativo u otros procesos generalmente siempre ocurren en términos de datos binarios.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Esto quiere decir que cualquier representación de datos son transformados en secuencias dividas &lt;strong&gt;(bytes)&lt;/strong&gt;, con el único propósito de no enviar una información en bruto sino que vaya de forma progresiva, veamos los siguientes ejemplos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;buffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;necromancer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// &amp;lt;Buffer 6e 65 63 72 6f 6d 61 6e 63 65 72&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En el anterior ejemplo se transforma un tipo de dato &lt;code&gt;String&lt;/code&gt; a &lt;code&gt;Buffer&lt;/code&gt;, por lo que se puede resumir que nuestra cadena de texto fue divida en secuencias de bytes.&lt;/p&gt;

&lt;p&gt;Pero este tipo de clase, se entiende como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Esta clase es una subclase de &lt;strong&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray" rel="noopener noreferrer"&gt;TypedArray&lt;/a&gt;&lt;/strong&gt; por lo que son bloques de memoria de tamaño fijo y no pueden contener ningún otro valor.&lt;/li&gt;
&lt;li&gt;El tamaño de un &lt;code&gt;Buffer&lt;/code&gt; es definido cuando se crea y no puede ser cambiado.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Etiquetas de Codificación
&lt;/h2&gt;

&lt;p&gt;Existen muchos cuando hablamos en general de codificación, pero entre tipo de datos como lo son &lt;code&gt;String&lt;/code&gt; y &lt;code&gt;Buffers&lt;/code&gt;, los que comúnmente se usan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;utf8&lt;/code&gt;: Multi-byte encoded Unicode characters.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hex&lt;/code&gt;: Encode each byte as two hexadecimal characters.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;base64&lt;/code&gt;: Base64 encoding.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Puedes encontrar otras etiquetas &lt;a href="https://nodejs.org/api/buffer.html#buffer_buffers_and_character_encodings" rel="noopener noreferrer"&gt;aquí&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A continuación veremos unos breves ejemplos de su creacion y comportamiento:&lt;/p&gt;

&lt;h2&gt;
  
  
  Crear un buffer
&lt;/h2&gt;

&lt;p&gt;En primera instancia la clase &lt;code&gt;Buffer&lt;/code&gt; en el entorno de Node.JS es una propieda global por lo que es accesible en cualquier archivo de tu proyecto y &lt;strong&gt;sin necesidad de &lt;code&gt;require()&lt;/code&gt;&lt;/strong&gt;. Para iniciar, existen varias formas de crear un buffer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Ejemplo basico para crear un Buffer&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;buffer1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;alloc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// &amp;lt;Buffer 00 00 00 00 00 00 00 00 00 00&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En el anterior ejemplo se ha creado un buffer "vacio" con el limite de tamaño de &lt;strong&gt;10 bytes&lt;/strong&gt;, siguiendo con este ejemplo, podemos agregar algun espaico en memoria de ese objeto buffer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Llenar los espacios varios y representarlos en un byte el caracter mostrado&lt;/span&gt;

&lt;span class="nx"&gt;buffer1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;y&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// &amp;lt;Buffer 79 79 79 79 79 79 79 79 79 79&amp;gt;&lt;/span&gt;

&lt;span class="nx"&gt;buffer1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utf8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// 'yyyyyyyyyy'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;De los &lt;strong&gt;10 bytes&lt;/strong&gt; reservados en memoria fueron llenados cada byte con el caracter &lt;strong&gt;Y&lt;/strong&gt; (recordemos que por defecto cada conversión por defecto evalúa la codificación &lt;code&gt;utf8&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Otra funcionalidad para crear buffers pero más dinámicos al momento de hablar de espacio en reserva, es derivado a esta función nativa de la clase:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Crear un nuevo buffer pasando un valor ya sea string or array&amp;lt;bytes&amp;gt;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;buffer2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;doom&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// &amp;lt;Buffer 64 6f 6f 6d&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esta función reservada llamada &lt;code&gt;from&lt;/code&gt; permite convertir caracteres o listas directamente a &lt;code&gt;Buffers&lt;/code&gt; teniendo en cuenta el tamaño del dato de origen, en este caso fue &lt;code&gt;'doom'&lt;/code&gt;, con un tamaño de &lt;strong&gt;4 bytes&lt;/strong&gt; en memoria.&lt;/p&gt;

&lt;p&gt;Tambien podemos cambiar el valor de alguna posición de nuestro buffer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Modificar alguna posición de nuestro buffer&lt;/span&gt;

&lt;span class="nx"&gt;buffer2&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mh"&gt;0x44&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;buffer2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utf8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// 'Doom'&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En el ejemplo anterior ha sido reemplazado la primera posición de nuestro buffer, que contiene el valor &lt;strong&gt;"d"&lt;/strong&gt; y al ser cambiado este debe ser representado como una codificación en &lt;code&gt;utf8&lt;/code&gt; a lo que traduce en que &lt;strong&gt;"D"&lt;/strong&gt; es equivalente a &lt;code&gt;0x44&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Propiedades
&lt;/h2&gt;

&lt;p&gt;A continuación veremos algunas funciones básicas (pero muy útiles) cuando usamos buffers:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;buffer.keys()&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Este retorna la cantidad de indices asociados al buffer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Traer el numero de indices en un `Iterator`&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;buffer3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;lovecraft&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;buffer3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// [0, 1, 2, 3, 4, 5, 6, 7, 8]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;buffer.lastIndexOf(value[, byteOffset][, encoding])&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Esta función verifica en que posición del arreglo de buffer se encuentra el valor que especificamos por parámetros:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Verificar la posicion de un valor determinado&lt;/span&gt;

&lt;span class="nx"&gt;buffer3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lastIndexOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;v&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// 2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;buffer.concat(Buffer[], [,totalLength])&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Basicamente juntar &lt;code&gt;N+1&lt;/code&gt; de buffers para devolver como resultado un nuevo buffer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Juntar varios objetos para retornar uno nuevo&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bufferSpace&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mh"&gt;0x20&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="c1"&gt;// Representa un espacio ' ' &lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;buffer4&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;buffer2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;bufferSpace&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;buffer3&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="nx"&gt;buffer4&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utf8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// 'Doom lovecraft'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;buffer.isEncoding(enconding)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Revisa y valida que tipo de codificación es referenciado en el objeto buffer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
&lt;span class="nx"&gt;buffer4&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isEncoding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utf8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;

&lt;span class="nx"&gt;buffer4&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isEnconding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;base64&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// false&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;Logramos saber un poco en manera de introducción que son los buffers, como se crean y que tipo de comportamientos trae en si, pero dentro de sus casos más utiles son al momento de integrarlos con &lt;code&gt;Streams&lt;/code&gt;, tomando como gran ventaja la facilidad de migrar datos progresivamente, convertir una imagen, o ofrecer videos en tiempo real.&lt;/p&gt;

&lt;p&gt;Espero que les haya gustado este breve post, un saludo. 😁&lt;/p&gt;

</description>
      <category>node</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
