使用Java的位填充错误检测技术

使用Java的位填充错误检测技术

位填充是数据通信系统中使用的一种技术,用于检测和纠正数据传输过程中可能发生的错误。它的工作原理是向正在传输的数据添加额外的位,以便在发生错误时进行标记。

在Java中实现位填充的一种常见方法是使用标志字节(如0x7E)来指示一帧的开始和结束,并使用特殊的转义字节(如0x7D)来指示下一帧byte 是一个填充位。例如,发送方会在发送的数据中每次出现标志字节之前添加一个填充位,这样标志字节就不会在接收方被误认为是帧的开始或结束。

这是一个如何在 Java 中实现位填充的示例 -

public static byte[] bitStuff(byte[] data) {
    final byte FLAG = 0x7E;
    final byte ESCAPE = 0x7D;

    // Create a new byte array to store the stuffed data
    byte[] stuffedData = new byte[data.length * 2];

    // Keep track of the current index in the stuffed data array
    int stuffedIndex = 0;

    // Iterate through the original data
    for (int i = 0; i < data.length; i++) {
        byte b = data[i];

        // If the current byte is the flag or escape byte, stuff it
        if (b == FLAG || b == ESCAPE) {
            stuffedData[stuffedIndex++] = ESCAPE;
            stuffedData[stuffedIndex++] = (byte) (b ^ 0x20);
        } else {
            stuffedData[stuffedIndex++] = b;
        }
    }

    return stuffedData;
}

在接收端,您可以使用类似的概念来检索原始数据。

public static byte[] bitUnStuff(byte[] data) {
    final byte FLAG = 0x7E;
    final byte ESCAPE = 0x7D;

    // Create a new byte array to store the unstuffed data
    byte[] unstuffedData = new byte[data.length];

    // Keep track of the current index in the unstuffed data array
    int unstuffedIndex = 0;

    // Iterate through the stuffed data
    for (int i = 0; i < data.length; i++) {
        byte b = data[i];

        // If the current byte is the escape byte, unstuff the next byte
        if (b == ESCAPE) {
            unstuffedData[unstuffedIndex++] = (byte) (data[++i] ^ 0x20);
        } else {
            unstuffedData[unstuffedIndex++] = b;
        }
    }

    return unstuffedData;
}

这是位填充技术的基本示例,可以对其进行增强以处理更多错误情况并使用 CRC 或校验和验证数据。

示例

当然!以下是如何在简单程序中使用 bitStuff() 和 bitUnStuff() 方法的示例 -
public static void main(String[] args) {
   byte[] data = {0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x7E};  // Hello~
   byte[] stuffedData = bitStuff(data);
   System.out.println("Original Data: "+Arrays.toString(data));
   System.out.println("Stuffed Data: "+ Arrays.toString(stuffedData));

   byte[] unstuffedData = bitUnStuff(stuffedData);
   System.out.println("Unstuffed Data: "+ Arrays.toString(unstuffedData));
}

当你运行这个程序时,它会首先调用bitStuff()方法来填充原始数据,然后打印出原始数据和填充后的数据。

Then it will call the bitUnStuff() method to retrieve the original data, then it will print the unstuffed data.

示例

对于给定的数据示例

0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x7E,

输出

您将得到输出

Original Data: [72, 101, 108, 108, 111, 126]
Stuffed Data: [72, 101, 108, 108, 111, 93, 30, 126]
Unstuffed Data: [72, 101, 108, 108, 111, 126]

可以看到填充数据多了一个字节93, 30,这是7E的填充版本。

您还可以看到未填充的数据与原始数据相同,这确认数据已成功检索,没有任何错误。

以上就是使用Java的位填充错误检测技术的详细内容,更多请关注编程之家其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读1k次。背景  我们在开发过程中,通常都会定义大量的JavaBean,然后通过IDE去生成其属性的构造器、getter、setter、equals、hashcode、toString方法,当要对某个属性进行改变时,比如命名、类型等,都需要重新去生成上面提到的这些方法,那Java中有没有一种方式能够避免这种重复..._非瞬态的属性有哪些
文章浏览阅读3.7k次,点赞2次,收藏7次。构造TreeMap可以指定Comparator,但是不能对value字段进行排序。如果有需求对Value字段排序,例如map存放的是单词,单词出现次数,怎么按单词次数排序呢?可以先将map中的key-value放入list,然后用Collections.sort对list排序,再将排序后的list放入LinkedHashMap,最后返回LinkedHashMap就可以了。LinkedH..._map 按某个属性值排序
文章浏览阅读681次,点赞2次,收藏3次。转自:java发送http的get、post请求Http请求类package wzh.Http;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.URL;imp..._java 报域名未知 但本地 发post 请求成功
文章浏览阅读1.4w次。SpringBoot 项目不加载 application.properties 配置文件产生原因:先是创建的SpringBoot2.几版本的项目,结果发现继续使用1.几版本的配置会有很多的问题,于是在pom.xml中把版本改回了1.5.9,然后发现项目启动时并不会加载 application.properties 配置文件。在下图中可以发现,SpringBoot2.几版本的 resou..._spring 未打包application.properties
文章浏览阅读5k次,点赞2次,收藏2次。命令jar tvf FAMS-0.0.1-SNAPSHOT.war | grep prop说明jar tvf 文件名 | grep 要搜索的内容 jar 命令参数说明用法: jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file] [entry-point] [-C dir] files ...选项: -c 创建新档案..._虚拟机如何快速查找之前用过的jar包
文章浏览阅读4.5w次,点赞11次,收藏4次。springboot日志配置 logging.path logging.file 注意事项可能有些小伙伴会同时配置 logging.path 和 logging.file,但是又发现其中一个不生效。官方文档中有这么一句:If you want to write log files in addition to the console output youneed to set a..._deprecated configuration property 'logging.path
文章浏览阅读2.9k次。最近用到了json字符串转实体类,转集合的功能,主要代码如下: /** * json 字符串转集合 * * @author lipw * @date 2017年5月10日下午6:08:17 * @param jsonString * @param pojoCalss * 集合中的类 * @return */ public st..._net.sf.json:jsonarray.tocollection日期格式错误
文章浏览阅读2.8k次。最近在做的项目中有一个消息功能,其中像系统消息的实现,就是在消息表中只有一条记录,然后对应每个用户要标记为删除或者已读,就在另一个表中用一条记录的标记。这样设置删除或已读标记的时候,是在另一个表的 Mapper.xml 中操作的,也就不会更新消息表的缓存。有人试图在ABMapper.xml 中采用cache-ref才解决这个问题,不好使。不知道是不是我配得不对。 ABMapper.xm..._多表查询缓存怎么更新
文章浏览阅读3.8w次,点赞4次,收藏14次。一个 Java 项目,除了需要引用 JDK 外,通常都是需要引用第三方 jar 包的,那怎么添加呢?我的作法是这样的:1、将需要引用的 jar 包添加到项目的 resources 目录下,比较多也可以在 resources 下再创建一个目录来保存,这样和配置文件区分开。为什么这么做?主要是考虑把它们也放到版本库中去,做为普通的项目,别人就不能再去找 jar 包了。其实 mave..._将第三方jar包直接放在resources目录下
文章浏览阅读3.2k次。另见:json 转日期出错,JSONArray.toCollection 时间总是转化为当前时间net.sf.json 这个包还真是存在不少问题。上代码:package net.sf.ezmorph.object;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util..._datemorpherex
文章浏览阅读1.6k次。遇到这个问题,有几种可能:1、项目打包的时候 mapping.xml 没有打包进去 2、项目打包的时候,配置文件没有打包进去检查:看看项目的“WEB-INF/classes”目录下,有没有配置文件。完整目录示例:E:Deployapache-tomcatwebappsROOTWEB-INFclasses 3、启用事务处理,但没有做AOP相关配置参考:..._springboot开启定时任务 报这个错org.springframework.beans.factory.beannotofre
文章浏览阅读4.4w次,点赞2次,收藏3次。完整的异常信息:org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.expression.spel.SpelEvaluationException: EL1008E: Property or field 't..._el1008e
文章浏览阅读1.2k次。Map排序的方式有很多种,这里记录下自己总结的两种比较常用的方式:按键排序(sort by key), 按值排序(sort by value)。1、按键排序jdk内置的java.util包下的TreeMap&lt;K,V&gt;既可满足此类需求,向其构造方法 TreeMap(Comparator&lt;? super K&gt; comparator) 传入我们自定义的比较器即可实现按键..._java map 按照key排序
文章浏览阅读2.8w次,点赞8次,收藏16次。常用的声明方式(使用静态代码块): public final static Map map = new HashMap(); static { map.put("key1", "value1"); map.put("key2", "value2"); } @SuppressWarnings("serial") private static Map<String, S..._java statis map
文章浏览阅读3.7w次,点赞8次,收藏8次。Consider injecting the bean as one of its interfaces or forcing the use of CGLib-based proxies by setting proxyTargetClass=true on @EnableAsync and/or @EnableCaching.问题描述Spring Boot 项目,启用事务支持时出现以下..._consider injecting the bean as one of its interfaces or forcing the use of c
文章浏览阅读1.2w次,点赞5次,收藏25次。转自: 注解@CrossOrigin解决跨域问题阅读目录:一、跨域(CORS)支持: 二、使用方法: 1、controller配置CORS 2、全局CORS配置 3、XML命名空间 4、How does it work? 5、基于过滤器的CORS支持 三、spring注解@CrossOrigin不起作用的原因 四、参考文章: 阅读正文:注解@Cro..._@corssorigin
文章浏览阅读6.3w次,点赞8次,收藏48次。application.properties 文件和 application.yml 文件有什么区别呢?yml文件的好处,天然的树状结构,一目了然,实质上跟properties是差不多的。官方给的很多demo,都是用yml文件配置的。注意点:1,原有的key,例如spring.jpa.properties.hibernate.dialect,按“.”分割,都变成树状的配置2,key后面的冒号,后_applicaiton.yml
文章浏览阅读2w次,点赞2次,收藏10次。这个问题要从“ java.io.IOException: Server returned HTTP response code: 403 for URL: http://start.spring.io”错误说起,eclipse 创建 spring boot 项目 遇到错误:java.io.IOException: Server returned HTTP response code: 403 fo_cannot determine embedded database driver class for database type none
文章浏览阅读2.3w次,点赞7次,收藏23次。application.yml application.properties prioritystackoverflow 上有个问题是:Can application.properties and application.yml be mixed? Spring Boot 虽然做了大量的工作来简化配置,但其配置依然是相当的复杂!支持的外部配置方式就高达 17 种之多,当然这很灵活,..._apollo和application.yml的优先级
文章浏览阅读8.3k次。p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco}项目启动后,控制台输出中有以下内容:[org.mybatis.spring.mapper.ClassPathMapperScanner]-No MyBatis mapper was found in '[com.xxx.xxx.dao]' package. Please check_org.mybatis.spring.mapper.classpathmapperscanner - no mybatis mapper was fou