使用Node-RED / JS的ASCII值数组,我需要将所有内容转换为一个长字符串。为了处理数组中不同数量的值,我发现了String.fromCharCode.apply(null,msg.payload);很棒,并且我的有效负载已按预期进行了转换-或至少部分进行了转换。
有效负载由许多布尔值和整数组成,最后是一个字符串。它输出的字符串很好,但不会转换整数和布尔值(暂时为3s和0s)。该数组包含121个ASCII值,但是字符串输出只有〜77个字符长。换句话说,
[0,45,83,51,0,0,0,0,1,0,0,0,14,0,202,0,19,162,0,0,0,0,0,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,49,53,55,52,48,55,57,54,57,50,56,48,54,48,48,48,48,48,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,80,70,86,32,1,0,0,99,103,114,111,117,112,47,99,32,0,0,0,0,0,0,0,0,0,0,0,0,71,80,82,77,67,44,49,50,50,49,51,50,46,48,48,44,65,44,52,52,52,52,46,50,48,56,48,53,44,78,44,48,48,52,52,52,46,50,55,51,50,51,44,69,44,48,46,48,49,51,44,44,49,56,49,49,49,57,44,44,44,68,42,55,55,13,0,13,0,48,48,48,42,54,68,13,0,50,44,0,0]
转换为类似
-S3yÆ1574241874748,092421.00,A,1324.56789,N,12345.56789,E,0.024,,201119,,,D*73`, while it would expect it to be something like `0,0,0,0,3,3,3,3,3,3,3,3,1574241874748,092421.00,A,1324.56789,N,12345.56789,E,0.024,,201119,,,D*73
注意:-S3yÆ
并非一开始就完全是输出,因为其中有一些特殊字符(显示为Æ
,但我不认为它确实是,并且它也有所不同并且不能由剪贴板处理)。我怀疑这是需要照顾的罪魁祸首。输入中有很多空值,我怀疑它们会导致fromCharCode
问题。
您要尝试的是解析二进制打包的数据结构。试图一次将整个内容转换为字符串char是不正确的方法。
该字符串看起来像是NEMA GPS字符串,所以我建议您将npm gps-module之类的内容作为自定义Node-RED节点的起点,或者至少暗示要包含在函数中的内容节点。
使用数组reduce
,效果很好。
let arr = [0,45,83,51,0,0,0,0,1,0,0,0,14,0,202,0,19,162,0,0,0,0,0,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,49,53,55,52,48,55,57,54,57,50,56,48,54,48,48,48,48,48,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,80,70,86,32,1,0,0,99,103,114,111,117,112,47,99,32,0,0,0,0,0,0,0,0,0,0,0,0,71,80,82,77,67,44,49,50,50,49,51,50,46,48,48,44,65,44,52,52,52,52,46,50,48,56,48,53,44,78,44,48,48,52,52,52,46,50,55,51,50,51,44,69,44,48,46,48,49,51,44,44,49,56,49,49,49,57,44,44,44,68,42,55,55,13,0,13,0,48,48,48,42,54,68,13,0,50,44,0,0]
let str = arr.reduce(function(str,value){return str + String.fromCharCode(value)},"")
console.log(str)
console.log(str.length)
console.log(arr.length)