如同消息头加密一样:对两字符串先进行转码,再求两转码后的异或,生成新的十六进制编码:
初步处理如下:
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;
}
}
即可
分享到:
相关推荐
在IT领域,尤其是在编程中,十六进制...总的来说,C/C++中的十六进制异或运算是一种强大的工具,它在编码、加密、数据校验等领域都有广泛应用。理解其原理并能熟练运用,对于提升编程技能和解决实际问题至关重要。
**十六进制文件编辑器——WinHex** WinHex是一款强大的十六进制编辑工具,尤其在计算机取证、数据恢复、嵌入式系统开发等领域被广泛使用。它的主要功能是允许用户查看和编辑二进制文件,包括硬盘驱动器、内存、闪存...
在二进制与十进制之间,十六进制有着独特的地位,因为一个十六进制数字可以表示4位二进制数,这使得它在处理二进制数据时特别方便,尤其是在内存、网络协议、颜色编码等领域。 易语言中的十六进制操作主要包括以下...
校验码= (【数据包编号】+【时间戳】+【功能代码】+【网关代码】+【数据 长度】+【数据信息】6 部分内容异或后,取非)
在计算机科学中,十六进制...在实际编程中,掌握十六进制转换有助于理解和调试涉及内存地址、颜色编码、网络协议等场景的问题。因此,对十六进制转换的掌握不仅是通过考试的关键,也是成为合格的Python程序员的基础。
8. **frmAnsi.frm**和**frmFindReplaceHex.frm**:可能是两个额外的窗体,分别用于处理ANSI编码相关操作和十六进制查找替换功能。 通过这些组件,开发者构建了一个完整的十六进制编辑器,提供了直观的界面和高效的...
十六进制(Hexadecimal)是计算机科学中常用的一种数字表示方式,特别是在内存地址、颜色编码和二进制数据处理中。理解并掌握十六进制转换是编程者的基本技能之一。 在易语言中,十六进制转换通常涉及到以下几个...
【VB十六进制器源码】是一个用于学习和理解十六进制编辑的编程资源,主要基于Visual Basic(VB)编程语言。在计算机科学中,十六进制是一种常用的数字表示方式,尤其是在处理二进制数据时。十六进制器通常是一个能够...
在十六进制中,每4位二进制对应一个十六进制数字,因此十六进制异或操作是对每个十六进制位进行二进制异或,然后将结果组合成新的十六进制数。例如,十六进制的"A"(二进制1010)与"B"(二进制1011)异或的结果是"F...
1. **可视化数据**:HEdit能够以彩色编码的十六进制和ASCII视图显示文件内容,便于快速识别特定字节模式。 2. **搜索与替换**:支持在整个文件中搜索特定字节序列,并进行替换操作,这对于查找和修复数据错误至关...
- 十六进制在处理二进制位操作时也很常见,如位与(&)、位或(|)、位异或(^)、位非(~)以及左移()和右移(>>)运算。 6. **Buffer对象**: - 在Node.js环境中,`Buffer` 类型可以处理二进制数据,其中包括...
内含四个实验代码,分别是Convert hex to base64 (编程将十六进制的字符串转换成base64编码);Fixed XOR (将两个等长的十六进制字符串进行异或);Single-byte XOR cipher (一个字符串被单字符加密,请找出该单...
4. **HEX编码与解码**:在JavaScript中,`btoa()`和`atob()`函数可以用来编码和解码Base64字符串,但它们不直接支持十六进制。为了处理十六进制字符串,可以使用自定义函数,例如将十六进制字符串转换为ASCII或...
综上所述,"ASCII码与16进制之间的转化工具"能够帮助开发者和用户方便地在两种编码系统间转换,同时提供16进制长度计算和异或校验功能,这对于数据处理、网络通信和编程实践都具有重要的实用价值。通过运行名为...
在解密过程中,如果原始数据是经过某种编码或加密的,通过将其转换成十六进制,我们可以更容易地进行分析和解密。 文本解密是指将已加密或编码的文本恢复到其原始可读状态的过程。这通常涉及到使用特定的密钥或算法...
4. **位逻辑异或运算** (`^`):对每个位进行异或运算,相同位结果为0,不同位结果为1。例如,`10010001 ^ 11110000`等于01100001。 5. **位左移运算** (`):将数字的所有位向左移动指定的位数,右侧空出的位用0填充...
总的来说,理解和操作十六进制是Java程序员必备的技能之一,它在处理二进制数据、网络协议、颜色编码等领域都有广泛的应用。一个十六进制计算器程序可以帮助我们快速验证和学习这些概念,通过实现这些功能,开发者...
13.将字节数组转换为十六进制字符数组 14.将字节数组转换为十六进制字符串 15.将十六进制字符串转换为字节数组 16.将十六进制字符转换成一个整数 17.截取字节数组 18.int转byte数组 19.byte数组转int 20.字节数组...
一个小工具,可以异或校验,还可以将字符串转换为十六进制的Unicode编码。VB写的。