Definición
La expresión $convert convierte tipos de datos binarios. Esto permite convertir datos binarios en los encabezados de Kafka.
$convertUna expresión
$converttiene las siguientes formas prototipo:{ input: "$binDataField", to: <int, long, double>, byteOrder: "little"|"big" } { input: "$intLongOrDoubleField", to: "binData", byteOrder: "little"|"big" } { input: "$binDataField", to: "string", format: <base64, base64url, hex, uuid, utf8> } { input: "$stringField", to: "binData", format: <base64, base64url, hex, uuid, utf8> }
Sintaxis
El El operador de agregación$convert convierte entre tipos de datos excepto los tipos de datos binarios ofrecidos en la versión Atlas Stream Processing de la $convert expresión.
La expresión $convert toma un documento con los siguientes campos:
Campo | Valor | Necesidad | Descripción |
|---|---|---|---|
|
| Requerido | Datos binarios que se convertirían en un tipo |
|
| Requerido | Especifica el tipo de datos al que se convierte |
| pequeño, grande | Opcional | Especifica el orden de bytes big-endian o little-endian de la entrada y la salida
|
| base64, base64url, hex, uuid, utf8 | Requerido | Especifica un argumento de formato de nivel superior de entrada y salida El método auxiliar |
Comportamiento
Si el valor de $convert.to es int, el valor de binData input debe ser 1, 2 o 4. Si el valor de $convert.to es long, el valor de binData input debe ser 1, 2, 4 o 8. Si el valor de input tiene una longitud inesperada, se genera un error. Puede controlar este comportamiento configurando $convert.onError.
Al convertir a binData, un int se convierte en un 4byte binData, un long en un 8byte binData y un double en un 8byte binData. Al convertir de binData a double, una entrada de 8bytes se interpreta como punto flotante de precisión doble IEEE 754, y una entrada de 4bytes se interpreta como punto flotante de precisión simple IEEE 754. Dado que MQL solo admite puntos flotantes de doble precisión, realiza una conversión sin pérdida del valor de punto flotante de precisión simple a doble precisión.
Conversión de binData a tipos numéricos:
$convertir.a | int | long | double |
|---|---|---|---|
Anchos permitidos (en bytes) | 1, 2, 4 | 1, 2, 4, 8 | 4, 8 |
| entero con signo en complemento a dos | entero con signo en complemento a dos | IEEE 754 punto flotante de precisión simple o doble |
Conversión de tipos numéricos a binData:
Entrada | int | long | double |
|---|---|---|---|
Ancho de salida (en bytes) | 4 | 8 | 8 |
Ejemplos
En los siguientes ejemplos, describimos binData utilizando notación binaria como:
BinData(0b00000000 00000010)
El byte más a la izquierda (00000000) corresponde a la dirección de memoria más baja, o al índice 0de la matriz de bytes. De forma similar, utilizamos notación hexadecimal, como:
BinData(0x0100 000A)
El byte más a la izquierda (01) corresponde a la dirección de memoria más baja o al índice 0del arreglo de bytes.
Los siguientes documentos son ejemplos de expresiones $convert que convierten valores en notaciones BinData, int, long y double:
{ $convert: { input: BinData(0b00000000 00000010), to: “int”, byteOrder: “big” } }
Resultado: 2
{ $convert: { input: BinData(0b00000001 00000000), to: “int”, byteOrder: “big” } }
Resultado: 256
{ $convert: { input: BinData(0b00000001 00000000), to: “int”, byteOrder: “little” } }
Resultado: 1
{ $convert: { input: BinData(0x0001 0000), to: “int”, byteOrder: “big” } }
Resultado: 65536
{ $convert: { input: BinData(0x0001 0000 0000 0000), to: “long”, byteOrder: “big” } }
Resultado: 281474976710656
{ $convert: { input: BinData(0xFFFE7960), to: “int”, byteOrder: “big” } }
Resultado: -100000
{ $convert: { input: BinData(0x0001 0000 0000 0000), to: “int”, byteOrder: “big” } }
Resultado: Error: la longitud de binData solo puede ser 1,2 o 4 bytes cuando == “int”.
{ $convert: { input: BinData(0xC04C CCCD), to: “double”, byteOrder: “big” } }
Resultado: -3.2000000476837158203125
{ $convert: { input: BinData(0x0000), to: “double”, byteOrder: “big” } }
Resultado: Error: la longitud de binData solo puede ser de 4 o 8 bytes cuando == “double”.
{ $convert: { input: true, to: “binData” } }
Resultado: BinData(0x01) // subtipo 0
{ $convert: { input: false, to: “binData” } }
Resultado: BinData(0x00) // subtipo 0
{ $convert: { input: NumberLong(42), to: “binData”, byteOrder: “big” } }
Resultado: BinData(0x0000 0000 0000 002A) // subtipo 0
{ $convert: { input: NumberLong(42), to: “binData”, byteOrder: “little” } }
Resultado: BinData(0x2A00 0000 0000 0000) // subtipo 0
{ $convert: { input: { $toInt: “$myNumericField” }, to: “binData”, byteOrder: “little” } }
Suponiendo que myNumericField es un Int(42), Long(42) o Double(42.0)...
Resultado: BinData(0x2A00 0000)
{ $convert: { input: “$myIntOrLongField”, to: “binData”, byteOrder: “little” } }
Si la entrada es Int(42):
Resultado: BinData(0x2A00 0000)
Si la entrada es Long(42):
Datos binarios (0x2A00 0000 0000 0000)