`
提烟而过
  • 浏览: 118176 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

十六进制编码求异或

阅读更多

如同消息头加密一样:对两字符串先进行转码,再求两转码后的异或,生成新的十六进制编码:

初步处理如下:

package com.foxconn;

import java.text.ParseException;

public class Aa {
	/*
	 * @author Yujie_Li
	 */
	private static String hexString = "0123456789ABCDEF"; 
	
    public static void main(String args[]) throws ParseException{
     	 String code1 = encode("9CE00K00781065");
     	 String code2 = encode("TOX$123FTOX$321");
     	 System.out.println(code1);
     	 System.out.println(code2);
     	byte [] a = code1.getBytes();
     	byte [] b = code2.getBytes();
     	byte [] c = new byte[code1.length()];
     	//byte类型需要先转化成字符数组,然后才能转化成字符串
     	StringBuffer sb = new StringBuffer();
     	String ret = "";
	 	for(int i =0;i<code1.length();i++){
	 		String hex = Integer.toHexString((a[i]& 0x0f)^(b[i]& 0x0f));
	 		ret += hex.toUpperCase();
            System.out.println("=========>>" + hex);
	 		c[i] = (byte) ((a[i]& 0xFF)^(b[i]& 0xFF));
	 		System.out.println(i+"--------"+Integer.toBinaryString(a[i])+
	 				"-------"+Integer.toBinaryString(b[i])+"----"+Integer.toBinaryString((a[i]& 0x0f)^(b[i]& 0x0f)));
	 		sb.append(c[i]&0xFF);
	 	 }
	     String code3 = sb.toString();
	 	 System.out.println(code3);
	 	 System.out.println(ret);
    }
    
    public static String encode(String str) {
    	   // 根据默认编码获取字节数组
    	   byte[] bytes = str.getBytes();
    	   String strs = "";
    	   // 将字节数组中每个字节拆解成2位16进制整数
    	   for (int i = 0; i < bytes.length; i++) {
    	   // 高四位
    	    strs += hexString.charAt((bytes[i] & 0xf0) >> 4);
    	    //System.out.println(i+"--"+bytes[i]+"----"+(bytes[i] & 0xf0)+"----"+hexString.charAt((bytes[i] & 0xf0) >> 4));
    	    // 低四位
    	    strs += hexString.charAt((bytes[i] & 0x0f) >> 0);
    	   }
    	   return strs;
    	}
}

 测试发现如果转码后求异或后某些超过16进制基数的无法得到正确解。特做如下修改:

package com.foxconn;
import java.text.ParseException;


public class Aa {
	private static String hexStr = "0123456789ABCDEF"; 
    public static void main(String args[]) throws ParseException{
    	
 	   String code1 = encode("9CE00K00781065");
     	   String code2 = encode("TOX$123FTOX$321");
 	   System.out.println(code1);
 	   System.out.println(code2);
 	   System.out.println("7F0C1D14017903767F6814010203");
 	   
 	    String result ="";
 	   for(int i=0; i<code1.length();i++){
 		   char c1 = code1.charAt(i);
 		   char c2 = code2.charAt(i);
 		   String a = convertHexToBinary(c1+"");
 		   String b = convertHexToBinary(c2+"");
 		   byte [] aa = a.getBytes();
 		   byte [] bb = b.getBytes();
 		   String cc ="";
 		   for( int j = 0;j<aa.length;j++ ){
 			  cc +=   aa[j]^bb[j];   
 		   }
 		   String tmp =Integer.toHexString(Integer.valueOf(cc,2).intValue()).toString();
 		  
 		  result +=tmp;
 	   }
    }
    
    public static String convertHexToBinary(String hexString){
        long l = Long.parseLong(hexString, 16);
        String binaryString = Long.toBinaryString(l);
        int shouldBinaryLen = hexString.length()*4;
        StringBuffer addZero = new StringBuffer();
        int addZeroNum = shouldBinaryLen-binaryString.length();
        for(int i=1;i<=addZeroNum;i++){
            addZero.append("0");
        }
        return addZero.toString()+binaryString;        
    }
    
    public static String encode(String str) {
    	   // 根据默认编码获取字节数组
    	   byte[] bytes = str.getBytes();
    	   String strs = "";
    	   // 将字节数组中每个字节拆解成2位16进制整数
    	   for (int i = 0; i < bytes.length; i++) {
                  //取得高四位
    	    strs += hexStr.charAt((bytes[i] & 0xf0) >> 4);
    	   // System.out.println(i+"--"+bytes[i]+"----"+(bytes[i] & 0xf0)+"----"+hexString.charAt((bytes[i] & 0xf0) >> 4)+"---"+hexString.charAt((bytes[i] & 0x0f) >> 0));
    	    //取得低四位
    	    strs += hexStr.charAt((bytes[i] & 0x0f) >> 0);
    	   }
    	   return strs;
    	}
}

 即可

分享到:
评论

相关推荐

    C/C++十六进制异或运算

    在IT领域,尤其是在编程中,十六进制...总的来说,C/C++中的十六进制异或运算是一种强大的工具,它在编码、加密、数据校验等领域都有广泛应用。理解其原理并能熟练运用,对于提升编程技能和解决实际问题至关重要。

    十六进制文件编辑器(WinHex 绿色版)

    **十六进制文件编辑器——WinHex** WinHex是一款强大的十六进制编辑工具,尤其在计算机取证、数据恢复、嵌入式系统开发等领域被广泛使用。它的主要功能是允许用户查看和编辑二进制文件,包括硬盘驱动器、内存、闪存...

    易语言源码易语言直接使用十六进制源码.rar

    在二进制与十进制之间,十六进制有着独特的地位,因为一个十六进制数字可以表示4位二进制数,这使得它在处理二进制数据时特别方便,尤其是在内存、网络协议、颜色编码等领域。 易语言中的十六进制操作主要包括以下...

    计算16进制校验位 要按字节进行“异或”后,取非

    校验码= (【数据包编号】+【时间戳】+【功能代码】+【网关代码】+【数据 长度】+【数据信息】6 部分内容异或后,取非)

    计算机二级python题库-基本操作题之十六进制转换.zip

    在计算机科学中,十六进制...在实际编程中,掌握十六进制转换有助于理解和调试涉及内存地址、颜色编码、网络协议等场景的问题。因此,对十六进制转换的掌握不仅是通过考试的关键,也是成为合格的Python程序员的基础。

    功能强大的十六进制编辑器_HexEditorB

    8. **frmAnsi.frm**和**frmFindReplaceHex.frm**:可能是两个额外的窗体,分别用于处理ANSI编码相关操作和十六进制查找替换功能。 通过这些组件,开发者构建了一个完整的十六进制编辑器,提供了直观的界面和高效的...

    易语言十六进制转换教学例程源码.rar

    十六进制(Hexadecimal)是计算机科学中常用的一种数字表示方式,特别是在内存地址、颜色编码和二进制数据处理中。理解并掌握十六进制转换是编程者的基本技能之一。 在易语言中,十六进制转换通常涉及到以下几个...

    VB十六进制器源码.rar

    【VB十六进制器源码】是一个用于学习和理解十六进制编辑的编程资源,主要基于Visual Basic(VB)编程语言。在计算机科学中,十六进制是一种常用的数字表示方式,尤其是在处理二进制数据时。十六进制器通常是一个能够...

    按位异或校验和计算器.rar_异或_异或在线计算_异或在线运算_按位异或_校验和计算器

    在十六进制中,每4位二进制对应一个十六进制数字,因此十六进制异或操作是对每个十六进制位进行二进制异或,然后将结果组合成新的十六进制数。例如,十六进制的"A"(二进制1010)与"B"(二进制1011)异或的结果是"F...

    HEdit(十六进制编辑器)下载 3.2.0.1 中文版

    1. **可视化数据**:HEdit能够以彩色编码的十六进制和ASCII视图显示文件内容,便于快速识别特定字节模式。 2. **搜索与替换**:支持在整个文件中搜索特定字节序列,并进行替换操作,这对于查找和修复数据错误至关...

    lipangza.github.io:十六进制

    - 十六进制在处理二进制位操作时也很常见,如位与(&)、位或(|)、位异或(^)、位非(~)以及左移()和右移(&gt;&gt;)运算。 6. **Buffer对象**: - 在Node.js环境中,`Buffer` 类型可以处理二进制数据,其中包括...

    密码学基本编码实践 base64编码转换 等长16进制异或 找出加密的单字符或字符串

    内含四个实验代码,分别是Convert hex to base64 (编程将十六进制的字符串转换成base64编码);Fixed XOR (将两个等长的十六进制字符串进行异或);Single-byte XOR cipher (一个字符串被单字符加密,请找出该单...

    hexa:用于处理十六进制的实用程序

    4. **HEX编码与解码**:在JavaScript中,`btoa()`和`atob()`函数可以用来编码和解码Base64字符串,但它们不直接支持十六进制。为了处理十六进制字符串,可以使用自定义函数,例如将十六进制字符串转换为ASCII或...

    ASCII码与16进制之间的转化工具

    综上所述,"ASCII码与16进制之间的转化工具"能够帮助开发者和用户方便地在两种编码系统间转换,同时提供16进制长度计算和异或校验功能,这对于数据处理、网络通信和编程实践都具有重要的实用价值。通过运行名为...

    TextEncode.zip

    在解密过程中,如果原始数据是经过某种编码或加密的,通过将其转换成十六进制,我们可以更容易地进行分析和解密。 文本解密是指将已加密或编码的文本恢复到其原始可读状态的过程。这通常涉及到使用特定的密钥或算法...

    C#16进制转换10进制

    4. **位逻辑异或运算** (`^`):对每个位进行异或运算,相同位结果为0,不同位结果为1。例如,`10010001 ^ 11110000`等于01100001。 5. **位左移运算** (`):将数字的所有位向左移动指定的位数,右侧空出的位用0填充...

    十六进制计算器

    总的来说,理解和操作十六进制是Java程序员必备的技能之一,它在处理二进制数据、网络协议、颜色编码等领域都有广泛的应用。一个十六进制计算器程序可以帮助我们快速验证和学习这些概念,通过实现这些功能,开发者...

    AppUtils.zip

    13.将字节数组转换为十六进制字符数组 14.将字节数组转换为十六进制字符串 15.将十六进制字符串转换为字节数组 16.将十六进制字符转换成一个整数 17.截取字节数组 18.int转byte数组 19.byte数组转int 20.字节数组...

    异或校验和Unicode编码

    一个小工具,可以异或校验,还可以将字符串转换为十六进制的Unicode编码。VB写的。

Global site tag (gtag.js) - Google Analytics