在ASCLL上掉过的坑

如果对ASCLL不了解的话,容易在进制转换以及由ASCLL值输出对应的ASCLL码(控制字符)时出现错误,由于本博主常犯错,故写下此篇避免错误的再犯。
下面列出常见控制字符及其对应的ASCLL值(往后的自己推理)
‘0’:48
‘9’:57
‘A’:65
‘Z’:90
‘a’:97
‘z’:122
如果是直接输出两个字符相减或相加,输出的值会是运算后的字符的ASCLL值,而不是对应字符,如cout<<‘a’-‘0’;输出:49
但如果是这样的cout<<char(‘F’+1),输出的便会是:G
cout<<char(‘F’-‘A’+3),输出的也会是一个字符

如果是高进制之间的转换呢,
例如在16进制中’A’对应的值是10
‘B’:11
‘C’:12
‘D’:13
‘E’:14
‘F’:15
如果在运算时得到一个大于等于10的数num,想将它转成对应字符,可通过char(num+‘A’-10)的方法得到。
反之有字符ch得到对应数字可以:ch-‘A’+10;

大概就这些了,希望我的总结能够对大家有帮助(更加清楚的理解概念)

### NMEA-0183 协议中的校验计算方法 NMEA-0183 是一种广泛应用于航海设备的数据通信协议,其数据帧通常以 `$` 开头,并以 `*` 两位十六进制数结尾作为校验。在校验的计算过程中,需要对 `$` `*` 之间的所有字符进行处理,而逗号 `,` 则被视为普通字符参与累加。 以下是具体的实现方式: #### 校验计算逻辑 对于 NMEA-0183 数据帧,校验通过以下步骤完成: 1. 提取 `$` `*` 之间的所有字符。 2. 对这些字符逐一按 ASCII 值进行 XOR 运算[^1]。 3. 将最终的结果转换为两位十六进制表示形式并与消息末尾的校验比较。 需要注意的是,在标准的 NMEA-0183 中并没有规定要忽略逗号 `,` 的特殊处理规则;因此,默认情况下,逗号会被视为普通的 ASCII 字符(ASCII 值为 44),与其他字符一样参与到 XOR 运算中。 如果存在特定需求希望 **忽略逗号** 并仅对其余字符执行累加操作,则可以修改算法如下: #### 修改后的校验计算流程 假设我们定义了一种变体规则——即在计算校验时跳过逗号 `,` 而只考虑其他字符,则可以通过以下伪代码描述该过程: ```python def calculate_checksum_nmea(message): checksum = 0 start_index = message.find('$') + 1 end_index = message.find('*') for char in message[start_index:end_index]: if char != ',': # 忽略逗号 checksum ^= ord(char) # 使用异或运算更新校验值 return f"{checksum:02X}" # 返回两位十六进制字符串形式 ``` 此函数接受完整的 NMEA 句子作为输入参数 `message`,并通过定位 `$` `*` 来提取有效部分用于校验计算。当遇到逗号时会跳过当前循环迭代而不改变现有校验状态。 #### 示例应用 给定一条典型的 NMEA GGA 句子为例来展示上述自定义规则的效果: 原始句子: ``` $GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,-32.3,M,,*47 ``` 按照常规做法得到的标准校验应为 `47` (十六进制),但如果采用前述调整策略排除掉所有的逗号影响后重新评估则会产生不同的数值结果。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值