🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
问题描述
用java代码编码一段16进制数据发给设备,比如我和设备约定使用奇效验或者偶校验,发送的16进制数据:0102030405校验位,
1.该校验位如何计算?
2.如何验证校验位结果是否正确?是否有在线16进制奇偶校验位生成器之类的
解决方案
如下是上述问题的解决方案,仅供参考:
在物联网或通信协议中,奇偶校验位(Parity Bit)是用于检测单比特错误的简单方式。对于一段数据,你可以选择奇校验(Odd Parity)或偶校验(Even Parity),其原理是:
- 奇校验(Odd Parity): 数据中 1 的总数量为奇数时,校验位为 0;数据中 1 的总数量为偶数时,校验位为 1,保证总的 1 的数量为奇数。
- 偶校验(Even Parity): 数据中 1 的总数量为偶数时,校验位为 0;数据中 1 的总数量为奇数时,校验位为 1,保证总的 1 的数量为偶数。
假设你要发送的 16 进制数据为 0102030405
,我们可以按照以下步骤计算校验位:
1. 计算校验位步骤
步骤一:将 16 进制数据转换为二进制
01
->00000001
02
->00000010
03
->00000011
04
->00000100
05
->00000101
步骤二:统计二进制中 1 的数量
数一下上述数据中所有二进制位中的 1
:
01
-> 102
-> 103
-> 204
-> 105
-> 2
总共 1 的数量为 1 + 1 + 2 + 1 + 2 = 7
,所以 1 的数量为 奇数。
步骤三:根据约定选择校验位
- 奇校验(Odd Parity): 1 的数量为奇数,校验位应为 0,表示不需要添加 1 来改变奇偶性。
- 偶校验(Even Parity): 1 的数量为奇数,校验位应为 1,保证 1 的数量变为偶数。
因此:
- 对于奇校验位,发送的数据可以是:
01020304050
(加 0)。 - 对于偶校验位,发送的数据可以是:
01020304051
(加 1)。
2. 验证校验位是否正确
假设你收到的带校验位的数据是 01020304050
或 01020304051
:
- 去掉校验位,统计剩余部分的二进制位中 1 的数量。
- 根据奇偶校验规则,检查该数据的校验位是否符合要求:
- 如果使用奇校验,校验位应使得所有的 1 的总数为奇数。
- 如果使用偶校验,校验位应使得所有的 1 的总数为偶数。
3. 在线奇偶校验位生成器
确实存在一些在线工具可以帮助生成奇偶校验位,通常你可以搜索“hex parity bit generator”或“在线奇偶校验生成器”,使用这些工具可以快速验证你的手动计算是否正确。
4. Java 代码实现
以下是一个简单的 Java 代码,用于计算和验证奇偶校验位:
public class ParityCheck {
// 计算奇偶校验位
public static int calculateParity(byte[] data, boolean isEvenParity) {
int count = 0;
// 统计1的数量
for (byte b : data) {
count += Integer.bitCount(b & 0xFF); // 统计每个字节中1的个数
}
// 奇偶校验判断
if (isEvenParity) {
return (count % 2 == 0) ? 0 : 1; // 偶校验
} else {
return (count % 2 == 0) ? 1 : 0; // 奇校验
}
}
// 验证校验位
public static boolean verifyParity(byte[] data, int parityBit, boolean isEvenParity) {
int calculatedParity = calculateParity(data, isEvenParity);
return calculatedParity == parityBit;
}
public static void main(String[] args) {
// 示例16进制数据:0102030405
byte[] data = {0x01, 0x02, 0x03, 0x04, 0x05};
// 计算奇校验位
int parityBit = calculateParity(data, false); // false表示奇校验
System.out.println("奇校验位: " + parityBit);
// 验证校验位是否正确(假设收到的校验位为 0)
boolean isValid = verifyParity(data, 0, false); // false表示奇校验
System.out.println("校验结果: " + (isValid ? "正确" : "错误"));
}
}
代码说明
calculateParity
方法: 计算给定数据的奇偶校验位,参数isEvenParity
决定使用奇校验还是偶校验。verifyParity
方法: 验证给定校验位是否正确。
希望如上措施及解决方案能够帮到有需要的你。
PS:如若遇到采纳如下方案还是未解决的同学,希望不要抱怨&&急躁,毕竟影响因素众多,我写出来也是希望能够尽最大努力帮助到同类似问题的小伙伴,即把你未解决或者产生新Bug黏贴在评论区,我们大家一起来努力,一起帮你看看,可以不咯。
若有对当前Bug有与如下提供的方法不一致,有个不情之请,希望你能把你的新思路或新方法分享到评论区,一起学习,目的就是帮助更多所需要的同学,正所谓「赠人玫瑰,手留余香」。
☀️写在最后
如上问题有的来自我自身项目开发,有的收集网站,有的来自读者…如有侵权,立马删除。再者,针对此专栏中部分问题及其问题的解答思路或步骤等,存在少部分搜集于全网社区及人工智能问答等渠道,若最后实在是没能帮助到你,还望见谅!并非所有的解答都能解决每个人的问题,在此希望屏幕前的你能够给予宝贵的理解,而不是立刻指责或者抱怨!如果你有更优解,那建议你出教程写方案,一同学习!共同进步。
ok,以上就是我这期的Bug修复内容啦,如果还想查找更多解决方案,你可以看看我专门收集Bug及提供解决方案的专栏《CSDN问答解惑-专业版》,都是实战中碰到的Bug,希望对你有所帮助。到此,咱们下期拜拜。
码字不易,如果这篇文章对你有所帮助,帮忙给 bug菌 来个一键三连(关注、点赞、收藏) ,您的支持就是我坚持写作分享知识点传播技术的最大动力。
同时也推荐大家关注我的硬核公众号:「猿圈奇妙屋」 ;以第一手学习bug菌的首发干货,不仅能学习更多技术硬货,还可白嫖最新BAT大厂面试真题、4000G Pdf技术书籍、万份简历/PPT模板、技术文章Markdown文档等海量资料,你想要的我都有!
📣关于我
我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿哇。