java byte数组拷贝_异或校验原理

java byte数组拷贝_异或校验原理其实在以前没接触这些内容的时候,脸上是懵逼的表情,完全不明白异或是为了干什么。其实用简单的语言来说,接收数据的异或校验相当于解密,发送时候的校验位相当于加密;官方解释是:其他数据信息传递中为保证数据传递正确可靠,在数据帧中常加载异或校验位(个人理解怕传输过程中出现数据丢失损坏的情况,所以加校验保证了数据的准确性)言归正传java中怎么异或校验1、发送数据byte[]rece=newbyte[6];rece[0]=0x55;

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

其实在以前没接触这些内容的时候,脸上是懵逼的表情,完全不明白异或是为了干什么。

其实用简单的语言来说,接收数据的异或校验相当于解密,发送时候的校验位相当于加密;

官方解释是:其他数据信息传递中为保证数据传递正确可靠,在数据帧中常加载异或校验位(个人理解怕传输过程中出现数据丢失损坏的情况,所以加校验保证了数据的准确性)

言归正传java中怎么异或校验

1、发送数据

        byte[] rece = new byte[6];
        rece[0] = 0x55;
        rece[1] = 0x01;
        rece[2] = (byte) 0xA1;
        rece[3] = 0x5F;
        rece[4] = 0x00;
        rece[5] = (byte) (rece[0] ^ rece[1] ^ rece[2] ^ rece[3] ^ rece[4]);

比如说有一个byte数组,第五位是校验位,那么校验位的就是前面所有位数数据的异或,即:

 

rece[5] = (byte) (rece[0] ^ rece[1] ^ rece[2] ^ rece[3] ^ rece[4]);

计算得出的校验位为AA,得到校验位之后就可以进行指令发送操作了;

2、解析数据

比如我们收到一个byte数组,其数据如下:

        rece[0] = 0x55;
        rece[1] = 0x01;
        rece[2] = (byte) 0xA2;
        rece[3] = 0x00;
        rece[4] = 0x00;
        rece[5] = 0xF6

 此时我们如何判断数据是准确的呢?还是通过异或校验

		int error=rece[5];
		for(int i=0; i<5;i++){
			error=error^ rece[i];
		}
		return error==0;

还是以rece[5]为校验位举例:当校验位与前面所有数据进行异或,最后得到的异或值=0时,表示数据是有效的。如果出现了其他情况,那么就需要排除一下了。

 

附几个byte数据操作常用的方法

/** 十六进制字符串转换byte数组*/
	public static byte[] hexStringToByteArray(String digits) {
		String s = digits.length() % 2 > 0 ? "0" + digits : digits;
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		for (int i = 0; i < s.length(); i += 2) {
			char c1 = s.charAt(i);
			if ((i + 1) >= s.length()) {
				throw new IllegalArgumentException("hexUtil.odd");
			}
			char c2 = s.charAt(i + 1);
			byte b = 0;
			if ((c1 >= '0') && (c1 <= '9'))
				b += ((c1 - '0') * 16);
			else if ((c1 >= 'a') && (c1 <= 'f'))
				b += ((c1 - 'a' + 10) * 16);
			else if ((c1 >= 'A') && (c1 <= 'F'))
				b += ((c1 - 'A' + 10) * 16);
			else
				throw new IllegalArgumentException("hexUtil.bad");

			if ((c2 >= '0') && (c2 <= '9'))
				b += (c2 - '0');
			else if ((c2 >= 'a') && (c2 <= 'f'))
				b += (c2 - 'a' + 10);
			else if ((c2 >= 'A') && (c2 <= 'F'))
				b += (c2 - 'A' + 10);
			else
				throw new IllegalArgumentException("hexUtil.bad");
			baos.write(b);
		}
		return (baos.toByteArray());

	}


/** byte数组 转换为 十六进制 字符串 */

    public static String byteArrayToHexStr(byte bytes[]) {

        StringBuffer sb = new StringBuffer(bytes.length * 2);
        for (int i = 0; i < bytes.length; i++) {
            sb.append(digitToHexChar((bytes[i] >> 4)));
            sb.append(digitToHexChar((bytes[i] & 0x0f)));
        }
        return (sb.toString());

    }
    private static char digitToHexChar(int value) {
        value = value & 0x0f;
        if (value >= 10){
            return ((char) (value - 10 + 'A'));
        }else{
            return ((char) (value + '0'));
        }
    }

 一些进制转换方法


	/**
	 * 16进制字符串转换为10进制数字
	 * @param hexs
	 * @return
	 */
	public static int decodeHEX(String hexs){
		BigInteger bigint=new BigInteger(hexs, 16);
		int numb=bigint.intValue();
		return numb;
	}

	/**
	 * 10进制数字转换为16进制字符串 1位时 补0
	 * @param n
	 * @return
	 */
	private String getNum(Integer n){
		String number=Integer.toHexString(n);
		if(number.length()==1){
			number="0"+number;
		}
		return number;
	}

	/**
	 * 10进制数字转换为16进制字符串
	 * @param numb
	 * @return
	 */
	public static String encodeHEX(Integer numb){
		String hex= Integer.toHexString(numb);
		return hex;
	}

 

 

 

 

 

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/188298.html原文链接:https://javaforall.net

(0)
上一篇 2026年4月17日 上午7:01
下一篇 2026年4月17日 上午7:07


相关推荐

  • java定时器_iphone如何定时发送短信

    java定时器_iphone如何定时发送短信定时任务(如:定时发送短信邮箱等)前面整过一个任务调度,它是固定在每天几点等执行,对于要手动加入的时间的定时发送短信不适用。学习quartz首先了解三个概念:调度器:负责调度作业和触发器;触发器:设置作业执行的时间、参数、条件等;(简单触发器和Cron触发器)作业:定时任务内容,被执行的程序;下载必要的jar包,将quartz-x.x.x.jar和core和/或optional文件夹中的…

    2022年10月13日
    5
  • WebViewJavascriptBridge使用

    WebViewJavascriptBridge使用由于项目中使用到原生和 H5 交互的技术 其实这个也有很多的解决方法 最后选择使用一个叫 WebViewJavas 的进行操作 在项目使用中遇到很多问题 在这把配置和使用问题一一罗列出来步骤 1 import WebViewJavas h 2 interfaceHom UIWebViewDel property str

    2025年12月10日
    5
  • cocos creator制作微信小游戏排行榜构建发布步骤

    cocos creator制作微信小游戏排行榜构建发布步骤1 主域游戏工程 项目 构建发布 发布平台 选择 微信小游戏 填入 APPID 构建 2 子域游戏过程 项目 构建发布 发布平台 选择 微信小游戏开放数据域 构建 3 在子域工程目录下 build 里的子域文件夹复制到主域工程目录下 build 文件夹下 wechatgame 文件夹里 4 打开微信 web 开发者工具 选择 小游戏 选择 导入项目 选

    2026年3月18日
    2
  • 程序员法则_智脑黑客

    程序员法则_智脑黑客1.作为一个真正的程序员,首先应该尊重编程,热爱你所写下的程序,他是你的伙伴,而不是工具。2.程序员可以让步,却不可以退缩,可以羞涩,却不可以软弱,总之,程序员必须是勇敢的。3.编程是一种单调的生活,因此程序员比普通人需要更多的关怀,更多的友情。4.程序不是年轻的专利,但是,他属于年轻。5.没有情调,不懂浪漫,也许这是程序员的一面,但拥有朴实无华的爱是他们的另一面。6.一个好汉

    2022年10月7日
    4
  • jenkins教程_1 简介「建议收藏」

    jenkins教程_1 简介「建议收藏」文章内容https://gitee.com/fakerlove/jenkins文章目录1.简介1.1介绍1.2环境准备1.2.1安装jenkins1)离线安装2)docker安装3)访问jenkins1.2.2安装gitlab一、安装及配置1.gitlab镜像拉取2.运行gitlab镜像3.配置4.创建一个项目二、用户使用1.下载git.exe2.登录gitlab网页3.设置ssh4.从gitlab克隆代码5.提交代码到gitlab1.2.3gitlab占用内存太多问题1.简.

    2022年5月15日
    39
  • vue和Jquery差别之动态添加删除元素

    vue和Jquery差别之动态添加删除元素vue和jquery都是耳熟能详的,我就不多赘述了,直接上正餐吧为了展示他们在动态添加删除元素的区别,我分别用他们写了同一个功能的小例子。这个例子要求要在输入框中输入字符串,按回车键后增加一行。点击蓝色按钮,数字增加。点击“X”按钮删除整行。很明显的是jquery的代码行数更为少,但是他的灵活性和代码逻辑性比vue’差。代码如下,有可以优化的地方望指正。

    2022年10月15日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号