荣小菜补钙记第45期:报文合成与解析之十六进制字符串与常显字符串的互映射转换
欢迎关注 内容更丰富
大家好,我是荣小菜,本期将讲解labview中十六进制字符串与常显字符串之间的互映射转换方法。 1. LabVIEW字符串简介在44期中,我们讲解了字符串的显示和含义,由于在LabVIEW中我们读取和发送报文大都是以字符串形式进行,只有对字符串的细节更了解才能顺利完成报文处理。因此,强烈建议新人先查看44期内容。
2. 字符串映射转换_正常显示转十六进制显示对于报文,我们推荐尽量将字符串报文转换并保持为数值或数值数组来进行数据处理,快速方便简单。但是,总会遇到有“哎呀已经写成这样没办法了”、“就是为了方便显示嘛”、“我不管我不管,救命啊”等各类情况,让我们不得不将已经“就这样了”的字符串数据转换为所需格式。
先看将正常显示下的字符串报文映射转换为十六进制显示,Demo如下图所示,我们将正常显示字符串“AABB14FC89AA01000E”转换为十六进制显示字符(Hex String)“AABB 14FC 89AA 0100 0E”,并额外提供了十六进制字符串数组(Hex String[])和十进制数值(Dec[])两种转换结果。
StringNormal2Hex_U8
上面是按U8转换的结果,下面是U16转换的结果。而对于U16来说,若是报文长度不足则最后1个字节不予转换。
StringNormal2Hex_U16
此外,Demo还支持字符串数组的转换映射,如下图所示,Operation选择”String[]2U8”或者” String[]2U16”,则可以将字符串数组[AA BB 14 FC]或者[AAAA BBBB 1414 FCFC]映射转换为十六进制显示形式。 String[]Normal2Hex_U8
String[]Normal2Hex_U16
Demo的代码比较简单,这里仅举例一部分代码进行分析,详细还请看源代码分享。String2U8的实现逻辑就是字符串分割,分割后的字符串进行十六进制字符串至数值转换,最后再强制类型转换回字符串。总体就是通过字符串-数字-字符串的转换实现映射。而如果是String[]2U8也是类似,只是省了分割步骤。
StringNormal2Hex_U8 后面板
不论如何,这种使用for循环切割再组合的方式速度肯定不会特别快,程序里将字节数组至字符串转换Vi放在For循环外面也是为了牺牲内存换运行速度。此外,若是不需要转换为十六进制字符串(Hex String[]),将其删除或者写成可选模式都可以大大提升运行速度。总之,运行速度是必须考虑的关键点之一,若是有更好的方法欢迎各位大神分享哈。
3. 字符串映射转换_十六进制显示转正常显示再来看将十六进制显示字符串映射转换为正常显示,Demo如下图所示,我们将十六进制字符串“AABB 14FC 89AA 0100 0E”转换为正常显示字符(Normal String)“AABB14FC89AA01000E”,并额外提供了正常显示的字符串数组(Normal String[])和十进制数值(Dec[])两种转换结果。
StringHex2Normal_U8
上面是按U8进行转换,而按U16(“Operation”选择”U16”)进行如下转换时,程序会先将不足U16的数据高位补齐。
StringHex2Normal_U16
Demo程序后面板如下图所示,此处仅举例U16转换。对于转换成正常显示字符串数组(Normal String[]),程序主要使用从字符串还原将字符串转为对应位数的数值,之后使用数值至十六进制字符串转换得到所需结果。而对于不足U16的情况,利用从字符串还原报错的机制将多余的字符串再按U8转换一次。
对于转换成正常显示字符串(Normal String),当然可以直接利用for循环,将上面的正常显示字符串数组(Normal String[])分割后连接转换得到。而Demo中则利用了LabVIEW自带的”数组至电子表格字符串转换”Vi(设分隔符为行结束符)。这样只需再将”行结束符”全部搜索替换即可完成转换。比起前者,这样的好处是除了可以一定程度并行执行,还避免进行大量的内存操作,执行效率极高。
StringHex2Normal_U16后面板
对于普通笔记本,使用Demo中的方法将十六进制字符串(Hex String)转常显字符串(Normal String),500字节的字符串运行1000000(1百万)次耗时仅2ms。而若使用for循环将字符串数组分割后再连接的方法,耗时将达到30000ms,两者运行效率相差15000倍。而随着字符串长度变长,后者的耗时还将大幅增加。
4. 总结本期分享的“十六进制字符串与常显字符串的互映射转换”属于迫不得已时应急使用的方法,虽然对报文的处理有所帮助,但还是建议尽量避免在大数据量时使用。执行效率和内存消耗的思考要贯穿整个生命周期。
分享开源免费,共同学习进步^_^