Estoy tratando de averiguar cómo trabajar con la representación del búfer en int. código sencillo
var buffer = Buffer.alloc(4, 'a'); var interface16 = new Uint16Array(buffer); var interface8 = new Uint8Array(buffer); console.log(interface16); console.log(interface8);¿Por qué el registro genera las mismas matrices (por valor y longitud)? Después de todo, estoy haciendo una representación de datos en forma de 1 y 2 bytes por entero. Al menos los manuales dicen que Uint8Array: toma 1 byte del búfer, que considero una secuencia de 0 y 1, en este caso 32 (4 * 8). Es decir, puedo aguantar el hecho de que será una matriz con 4 elementos. Pero Uint16Array toma 2 bytes para un entero, es decir, el número debe ser diferente y el tamaño de la matriz es 2. ¿En qué me equivoco y qué búfer pasar a estos constructores para ver visualmente la diferencia? Sospecho que, en cualquier caso, la matriz devuelta tendrá la misma longitud que la cantidad de bytes, o que se trata de cómo la consola genera la salida. Probablemente. Pero no hay suficiente conocimiento para entender por qué. Gracias por su atención.
PD: Si también recomienda alguna literatura que no haga estallar el cerebro directamente sobre este tema, sería genial.
primero crea un búfer con 4 a dentro.
entonces llamas a esta función con el búfer:
el documento dice: new Uint16Array(object); Cuando se llama con un argumento de objeto, se crea una nueva matriz con tipo como si fuera el método TypedArray.from().
ver más: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/from
crea una matriz de 4 uint16 usando cada byte del búfer
a = 0x61 = 97 obtienes cuatro 97.
aquí hay un desbordamiento de pila de un búfer exitoso para la conversión de uint16 convertir el búfer de nodejs a Uint16Array
En su ejemplo, ambas matrices escritas terminan teniendo 4 elementos, pero Uint8Array solo usa 4 bytes para representar su contenido, mientras que Uint8Array usa 8. Puede ver esto al inspeccionar la propiedad byteLength :
var buffer = Buffer.alloc(4, 'a'); var interface16 = new Uint16Array(buffer); var interface8 = new Uint8Array(buffer); console.log('Uint16 length: %d', interface16.length); console.log('Uint16 byteLength: %d', interface16.byteLength); console.log('Uint8 length: %d', interface8.length); console.log('Uint8 byteLength: %d', interface8.byteLength);Producción
Uint16 longitud: 4 Uint16 byte Longitud: 8 Uint8 longitud: 4 Uint8 byte Longitud: 4
Por lo tanto, los constructores de matrices tipificadas están creando matrices tipificadas con la misma cantidad de elementos que el búfer de origen, pero el constructor Uint16Array usa dos bytes en lugar de uno para cada elemento, llenando el byte de orden superior de cada elemento con cero.