在处理底层报文时,经常会遇到把byte数组打印到控制台或日志,查看转换的数组是否正确。也会遇到把十六进制字符串转换为字节数组,以下对两种场景进行转换处理。
1.将指定byte数组以十六进制的形式打印
//方法一:调用()方法,把每一个字节转换成字符串
public void BytePrintAsString(byte [] byteArray) {
for (int i = 0; i < ; i++) {
String hex = (byteArray[i] & 0xFF);
if (() == 1) {
hex = '0' + hex;
}
(());
}
();
}
参考:/thanq/article/details/83355863
//方法二:通过把一个字节转成int值,int值再转十六进制。最后,通过for循环打印整个字节数组。
//一个字节以十六进制字符串展示,如0x43,打印结果43,非67(0x43对应int值)。
public String toHexString(byte b){
String str = "";
int value = b;
int remainder = 0;//余数
if(value == 0){//处理字节0x00
str = "00";
}else if(value < 0){
//处理字节0xA0-0xFF,直接打印是最高位-1数字的补码,如字节0xA5,直接打印结果为-91
value = value + 256;
}
while(value != 0){//处理字节0x01-0x9F
remainder = value % 16;
if(remainder < 10){
str = (remainder) + str;
}else{
switch (remainder) {
case 10:
str = 'A' + str;
break;
case 11:
str = 'B' + str;
break;
case 12:
str = 'C' + str;
break;
case 13:
str = 'D' + str;
break;
case 14:
str = 'E' + str;
break;
case 15:
str = 'F' + str;
break;
}
}
value = value/16;
}
if(() < 2){//处理值在0-15的一个字节
return '0' + str;
}
return str;
}
2.十六进制字符串转字节数组
public void HexStringToByteArray(String byteStr) {
char [] charArray =();
byte [] byteArrayNew = new byte[/2];
int high = 0;//十六进制一个字节,高4位
int low = 0;//十六进制一个字节,低4位
for(int i=0;i<;i+=2) {
//high
if(charArray[i]>='1' && charArray[i]<='9')
{
high = charArray[i]-'0';
}else if(charArray[i]>='A' && charArray[i]<='F')
{
high = charArray[i]-'A'+10;
}else if(charArray[i]>='a' && charArray[i]<='f')
{
high = charArray[i]-'a'+10;
}
//low
if(charArray[i+1]>='1' && charArray[i+1]<='9')
{
low = charArray[i+1]-'0';
}else if(charArray[i+1]>='A' && charArray[i+1]<='F')
{
low = charArray[i+1]-'A'+10;
}else if(charArray[i+1]>='a' && charArray[i+1]<='f')
{
low = charArray[i+1]-'a'+10;
}
byteArrayNew[i/2] =(byte) (high*16+low);
}
for (int i = 0; i < ; i++) {
String hex = (byteArrayNew[i] & 0xFF);
if (() == 1) {
hex = '0' + hex;
}
(() );
}
}
3.转换测试
public static void main(String[] args) {
//上面方法自行封装类
StringAndByteArraySwitch switchObj = new StringAndByteArraySwitch();
byte [] byteArray = {0x01,0x03,0x00,0x04,0x00,0x02,(byte)0x85,(byte)0xca};
(byteArray);
//01030004000285CA
String byteStr = "01030004000285CA";
(byteStr);
//01030004000285CA
}
希望对遇到相关问题的小伙伴有帮助,写的不好请大家担待如有更好的方法,或者建议请评论区留言,大家一起讨论,谢谢~