Definición
La expresión $convert convierte tipos de datos binarios. Esto se puede utilizar para 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 operador de agregación $convert convierte entre tipos de datos, excepto los tipos de datos binarios que se ofrecen en la versión de Atlas Stream Processing de la expresión $convert.
La expresión $convert acepta 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
|
| auto, base64, base64url, hex, uuid, utf8 | Condicional | Especifica el formato para la entrada y salida de
El método asistente |
Comportamiento
Si el valor de $convert.to es int, el valor 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 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 4de bytes binData, un long se convierte en un 8de bytes binData, y un double se convierte en un 8de bytes binData. Al convertir de binData a double, una entrada de 8bytes se interpreta como punto flotante de doble precisión IEEE 754, y una entrada de 4bytes se interpreta como punto flotante de precisión simple IEEE 754. Dado que MQL solo soporta punto flotante de doble precisión, realiza una conversión sin pérdidas del valor de punto flotante de simple precisión a doble precisión.
Convertiendo binData a tipos numéricos:
$convert.to | 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 0del arreglo de bytes. De manera similar, utilizamos notación hexadecimal como la siguiente:
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 documentos siguientes son expresiones de $convert de ejemplo que convierten valores entre las 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 to == "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 4 o 8 bytes cuando to == “double”
{ $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) // sub-tipo 0
{ $convert: { input: { $toInt: “$myNumericField” }, to: “binData”, byteOrder: “little” } }
Suponiendo que myNumericField sea un Int(42), un Long(42) o un 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):
BinData(0x2A00 0000 0000 0000)