$convert
定義
$convert
式はバイナリ データ型を変換します。これは、Kafkaヘッダーのバイナリ データを変換するために使用できます。
$convert
$convert
式には次のプロトタイプ形式があります。{ 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> }
構文
$convert 集計演算子は、$convert
式の Atlas Stream Processing バージョンで提供されているバイナリ データ型以外のデータ型間で変換を行います。
$convert
式は、次のフィールドを含むドキュメントを受け付けます。
フィールド | 値 | 必要性 | 説明 |
---|---|---|---|
|
| 必須 |
|
|
| 必須 |
|
| little, big | 必須 |
注意
|
| base64, base64url, hex, uuid, utf8 | 必須 |
注意
|
動作
$convert.to
の値が int
の場合、 binData
input
値は 1
、2
、または 4
である必要があります。$convert.to
の値が long
の場合、binData
input
値は 1
、2
、4
、または 8
である必要があります。input
が予期せぬ長さの場合、エラーが発生します。この動作は、$convert.onError
を設定することで制御できます。
binData
に変換すると、int
は 4 バイトの binData
になり、 long
は 8 バイトのbinData
になり、double
は 8 バイトの binData
になります。 binData
から double
に変換する場合、8 バイトの入力は IEEE 754 倍精度浮動点として解釈され、4 バイトの入力は IEEE 754 単精度浮動小数点として解釈されます。 MQL は倍精度浮動点のみをサポートするため、単精度浮動点値から倍精度へのロスレス変換を実行します。
binData
を数値型に変換する:
$convert.to | int | long | double |
---|---|---|---|
許容される幅(バイト単位) | 1, 2, 4 | 1, 2, 4, 8 | 4, 8 |
| 2 の補完符号付き整数 | 2 の補完符号付き整数 | IEEE 754 の単精度または倍精度浮動点 |
数値型を binData
に変換する:
入力 | int | long | double |
---|---|---|---|
出力幅(バイト単位) | 4 | 8 | 8 |
例
次の例では、binData
を次のような 2 進表記法で説明します。
BinData(0b00000000 00000010)
一番左のバイト (00000000) は、一番下のメモリアドレス、すなわちバイト配列の 0 番目のインデックスに対応します。同様に、次のような 16 進数表記を使用します。
BinData(0x0100 000A)
一番左のバイト (01) は、一番下のメモリアドレス、すなわちバイト配列の 0 番目のインデックスに対応します。
次のドキュメントは、BinData
、int
、long
、double
表記にわたって値を変換する $convert
式の例です。
{ $convert: { input: BinData(0b00000000 00000010), to: “int”, byteOrder: “big” } }
結果: 2
{ $convert: { input: BinData(0b00000001 00000000), to: “int”, byteOrder: “big” } }
結果: 256
{ $convert: { input: BinData(0b00000001 00000000), to: “int”, byteOrder: “little” } }
結果: 1
{ $convert: { input: BinData(0x0001 0000), to: “int”, byteOrder: “big” } }
結果: 65536
{ $convert: { input: BinData(0x0001 0000 0000 0000), to: “long”, byteOrder: “big” } }
結果: 281474976710656
{ $convert: { input: BinData(0xFFFE7960), to: “int”, byteOrder: “big” } }
結果: -100000
{ $convert: { input: BinData(0x0001 0000 0000 0000), to: “int”, byteOrder: “big” } }
結果: Error- binData 長さは、 == int の場合、1 、2 、または 4 バイトのみになります。
{ $convert: { input: BinData(0xC04C CCCD), to: “double”, byteOrder: “big” } }
結果: -3.2000000476837158203125
{ $convert: { input: BinData(0x0000), to: “double”, byteOrder: “big” } }
結果: エラー – binData の長さは、to == “double” の場合、4 または 8 バイトのみになります。
{ $convert: { input: true, to: “binData” } }
結果: BinData(0x01) // サブタイプ 0
{ $convert: { input: false, to: “binData” } }
結果: BinData(0x00) // サブタイプ 0
{ $convert: { input: NumberLong(42), to: “binData”, byteOrder: “big” } }
結果: BinData(0x0000 0000 0000 002A) // サブタイプ 0
{ $convert: { input: NumberLong(42), to: “binData”, byteOrder: “little” } }
結果: BinData(0x2A00 0000 0000 0000) // サブタイプ 0
{ $convert: { input: { $toInt: “$myNumericField” }, to: “binData”, byteOrder: “little” } }
myNumericField が Int(42)、Long(42)、または Double(42.0) であると仮定します...
結果: BinData(0x2A00 0000)
{ $convert: { input: “$myIntOrLongField”, to: “binData”, byteOrder: “little” } }
入力が Int(42) の場合:
結果: BinData(0x2A00 0000)
入力が Long(42) の場合:
BinData(0x2A00 0000 0000 0000)