【发布时间】:2021-09-25 16:55:56
【问题描述】:
我正在尝试使用 Snowflake 中的用户定义函数对来自 Kafka Debezium Payload 的值(16 位签名大端序)进行 base64 解码。不幸的是,我只能使用 Javascript,而 Snowflake 使用 Javascript 标准库。我找到了一个 NodeJS 的工作示例,它使用了 Buffer 模块,但在 Javascript 中不可用。
var kafkaDecodeNumber = function(base64EncodedNumber) {
var byteArray = Buffer.from(base64EncodedNumber, 'base64');
var value = 0;
for (var i = 0; i < byteArray.length; i++) {
value = (value * 256) + byteArray[i];
}
return value;
};
var float = parseFloat(kafkaDecodeNumber( price )).toFixed(38) / 100
这是我在其他地方使用的一些工作代码示例
Python
ctx = decimal.Context()
ctx.prec = 38
result = ctx.create_decimal(
int.from_bytes(base64.b64decode(byte_value), byteorder='big')
) / 100
return result
红宝石
event.get('price').unpack1('m*').unpack1('B*').to_i(2) / 100.0)
这里的任何帮助都会很棒!
【问题讨论】:
-
你能提供一个编码字符串的例子和预期的解码结果吗?
-
当然!解码强:“D6A =”预期结果为数字:40
-
new DataView(new Uint8Array(atob(base64EncodedNumber).split('').map(v => v.charCodeAt(0))).buffer).getInt16(0); -
@Bravo 的输出是正确的,但是,在 Snowflake 中执行时出现以下错误:
-
一旦我将
new Uint8Array更改为new Uint16Array,它似乎就可以工作了。谢谢!
标签: javascript apache-kafka base64 debezium