java可以用来修改一个字符串的16进制字节。
比如这样一个需求:
将输入的字符串的字节替换成以a0 b1开头 c2 d3结尾的
长度为128的字节,并且将需要替换的字节放到靠近c2的
位置,前面都用cf填充,类似这样:
操作前:
64 61 73 64 61 73 64 73 61 64 61 73 66 73 6B 64
66 77 75 65 69 66 E9 98 BF E8 90 A8 E5 BE B7 E6
92 92
操作后:
a0 b1 cf cf cf cf cf cf cf cf cf cf cf cf cf cf
cf cf cf cf cf cf cf cf cf cf cf cf cf cf cf cf
cf cf cf cf cf cf cf cf cf cf cf cf cf cf cf cf
cf cf cf cf cf cf cf cf cf cf cf cf cf cf cf cf
cf cf cf cf cf cf cf cf cf cf cf cf cf cf cf cf
cf cf cf cf cf cf cf cf cf cf cf cf 64 61 73 64
61 73 64 73 61 64 61 73 66 73 6B 64 66 77 75 65
69 66 E9 98 BF E8 90 A8 E5 BE B7 E6 92 92 c2 d3
具体的思路是:先找到字符串的16进制,然后按照需求对16进制进行操作
需要掌握的几点是:
1.获取字符串字节:string.getBytes();
2.生成一个用来填充字节的buffer:ByteBuffer.allocate(128);
3.字节的生成以及填充:byte[] headBytes = {(byte) 0xa0,(byte) 0xb1}; byteBuffer.put(headBytes);
代码如下
package demo;
import java.nio.ByteBuffer;
import utils.RadixUtil;
/**
*
* @author qq1623299667
*
*/
public class UpdateByte {
public static void main(String[] args) {
String test = "dasdasdsadasfskdfwueif阿萨德撒";
String testHex = RadixUtil.stringToHex(test, "utf-8");
System.out.println(testHex);
testHex = updateByte128(test);
System.out.println(testHex);
}
/**
* =================特定的字节修改操作=================
* 需求:将输入的字符串的字节替换成以a0 b1开头 c2 d3结尾的
* 长度为128的字节,并且将需要替换的字节放到靠近c2的位置,前面
* 都用cf填充,类似这样:
* 操作前:
* 64 61 73 64 61 73 64 73 61 64 61 73 66 73 6B 64
* 66 77 75 65 69 66 E9 98 BF E8 90 A8 E5 BE B7 E6
* 92 92
* 操作后:
* a0 b1 cf cf cf cf cf cf cf cf cf cf cf cf cf cf
* cf cf cf cf cf cf cf cf cf cf cf cf cf cf cf cf
* cf cf cf cf cf cf cf cf cf cf cf cf cf cf cf cf
* cf cf cf cf cf cf cf cf cf cf cf cf cf cf cf cf
* cf cf cf cf cf cf cf cf cf cf cf cf cf cf cf cf
* cf cf cf cf cf cf cf cf cf cf cf cf 64 61 73 64
* 61 73 64 73 61 64 61 73 66 73 6B 64 66 77 75 65
* 69 66 E9 98 BF E8 90 A8 E5 BE B7 E6 92 92 c2 d3
* ==================================================
* @param string
* @return
*/
private static String updateByte128(String string) {
try {
byte[] originBytes = string.getBytes();
if(originBytes.length>0 && originBytes.length<125){//最大长度是128字节,去掉头和尾,数据长度最多只能有124个字节
byte[] fillingBytes = null;
if (originBytes.length!=124) {//准备填充的字节
fillingBytes = new byte[124 - originBytes.length];
for (int i = 0; i < fillingBytes.length; i++) {
fillingBytes[i] = (byte) 0xcf;
}
}
ByteBuffer byteBuffer = ByteBuffer.allocate(128);//开始填充新字节
byte[] headBytes = {(byte) 0xa0,(byte) 0xb1};
byte[] tailBytes = {(byte) 0xc2,(byte) 0xd3};
byteBuffer.put(headBytes);//按照约定的顺序依次填充
byteBuffer.put(fillingBytes);
byteBuffer.put(originBytes);
byteBuffer.put(tailBytes);
byteBuffer.flip();
byte[] resultBytes = byteBuffer.array();
String tempString = RadixUtil.bytesToHex(resultBytes);
String[] split = tempString.split(" ");
String resultString = "";
for(int i=0;i<split.length;i++){
resultString = resultString+split[i]+" ";
if(i%16==15){
resultString = resultString+"\r\n";
}
}
return resultString;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
package utils;
import java.io.UnsupportedEncodingException;
/**
*
* @author qq1623299667
*
*/
public class RadixUtil {
public static void main(String[] args) {
String string = "daxiaojie:野外独自徘徊的可怜家伙,能够收获的只有炮火";
String hex = stringToHex(string,"utf-8");
System.out.println(hex);
OutPutUtil.outPutString(hex, "utf-8", "d:", "1.txt");
}
/**
* 将任何字符串按指定编码输出成特定格式的16进制
* @param string
* @param charsetName
* @return
*/
public static String stringToHex(String string,String charsetName) {
if (string.length()>0) {
String str = "";
try {
for (int i = 0; i < string.length(); i++) {
char ch = string.charAt(i);
byte[] bytes = String.valueOf(ch).getBytes(charsetName);
if (bytes!=null) {
String hex = bytesToHex(bytes);
str = str + hex;
}
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
String[] split = str.split(" ");
String str2 = "";
for(int i=0;i<split.length;i++){
str2 = str2 + split[i] + " ";
if(i%16==15){
str2 = str2 + "\r\n";
}
}
return str2;
}else{
return "请输入任意文本!";
}
}
/**
* 将字节码数组按16进制的方式保存为字符串(按空格切开)
* @param bytes
* @return
*/
public static String bytesToHex(byte[] bytes){
StringBuilder sb = new StringBuilder("");
if (bytes == null || bytes.length <= 0) {
return null;
}
for (int i = 0; i < bytes.length; i++) {
int num = bytes[i] & 0xFF;
String hex = Integer.toHexString(num).toUpperCase()+" ";
if (hex.length() < 2) {
sb.append(0);
}
sb.append(hex);
}
return sb.toString();
}
}
最后的输出结果
64 61 73 64 61 73 64 73 61 64 61 73 66 73 6B 64
66 77 75 65 69 66 E9 98 BF E8 90 A8 E5 BE B7 E6
92 92
A0 B1 CF CF CF CF CF CF CF CF CF CF CF CF CF CF
CF CF CF CF CF CF CF CF CF CF CF CF CF CF CF CF
CF CF CF CF CF CF CF CF CF CF CF CF CF CF CF CF
CF CF CF CF CF CF CF CF CF CF CF CF CF CF CF CF
CF CF CF CF CF CF CF CF CF CF CF CF CF CF CF CF
CF CF CF CF CF CF CF CF CF CF CF CF 64 61 73 64
61 73 64 73 61 64 61 73 66 73 6B 64 66 77 75 65
69 66 E9 98 BF E8 90 A8 E5 BE B7 E6 92 92 C2 D3