Android字符串和十六进制相互转化出现的中文乱码问题
废话不读说了,直接给大家贴代码了,代码附有注释,可以说明一切,本文写的不好,还请见谅。
importjava.io.ByteArrayOutputStream;
/**
*CreatedbyAdministratoron2016/2/2.
*-----------16进制和字符串互转---------
*------------解决中文乱码问题---------
*/
publicclassStringToSixthUtils{
privatestaticStringhexString="0123456789abcdef";
/*
*将字符串编码成16进制数字,适用于所有字符(包括中文)
*/
publicstaticStringencode(Stringstr){
//根据默认编码获取字节数组
byte[]bytes=str.getBytes();
StringBuildersb=newStringBuilder(bytes.length*2);
//将字节数组中每个字节拆解成2位16进制整数
for(inti=0;i<bytes.length;i++){
sb.append(hexString.charAt((bytes[i]&0xf0)>>4));
sb.append(hexString.charAt((bytes[i]&0x0f)));
}
returnsb.toString();
}
/*
*将16进制数字解码成字符串,适用于所有字符(包括中文)
*/
publicstaticStringdecode(Stringbytes){
ByteArrayOutputStreambaos=newByteArrayOutputStream(bytes.length()/2);
//将每2位16进制整数组装成一个字节
for(inti=0;i<bytes.length();i+=2)
baos.write((hexString.indexOf(bytes.charAt(i))<<4|hexString.indexOf(bytes.charAt(i+1))));
returnnewString(baos.toByteArray());
}
}
下面给大家分享一段代码关于16进制字符串和字节数组互相转换
packagecom.wpn.net.util;
publicclassNumberChange{
/*
*把16进制字符串转换成字节数组@paramhex@return
*/
publicstaticbyte[]hexStringToByte(Stringhex){
intlen=(hex.length()/2);
byte[]result=newbyte[len];
char[]achar=hex.toCharArray();
for(inti=0;i<len;i++){
intpos=i*2;
result[i]=(byte)(toByte(achar[pos])<<4|toByte(achar[pos+1]));
}
returnresult;
}
privatestaticbytetoByte(charc){
byteb=(byte)"0123456789ABCDEF".indexOf(c);
returnb;
}
/**
*把字节数组转换成16进制字符串
*
*@parambArray
*@return
*/
publicstaticfinalStringbytesToHexString(byte[]bArray){
StringBuffersb=newStringBuffer(bArray.length);
StringsTemp;
for(inti=0;i<bArray.length;i++){
sTemp=Integer.toHexString(0xFF&bArray[i]);
if(sTemp.length()<2)
sb.append(0);
sb.append(sTemp.toUpperCase());
}
returnsb.toString();
}
/**
*@函数功能:BCD码转为10进制串(阿拉伯数据)
*@输入参数:BCD码
*@输出结果:10进制串
*/
publicstaticStringbcd2Str(byte[]bytes){
StringBuffertemp=newStringBuffer(bytes.length*2);
for(inti=0;i<bytes.length;i++){
temp.append((byte)((bytes[i]&0xf0)>>>4));
temp.append((byte)(bytes[i]&0x0f));
}
returntemp.toString().substring(0,1).equalsIgnoreCase("0")?temp.toString().substring(1):temp.toString();
}
/**
*@函数功能:10进制串转为BCD码
*@输入参数:10进制串
*@输出结果:BCD码
*/
publicstaticbyte[]str2Bcd(Stringasc){
intlen=asc.length();
intmod=len%2;
if(mod!=0){
asc="0"+asc;
len=asc.length();
}
byteabt[]=newbyte[len];
if(len>=2){
len=len/2;
}
bytebbt[]=newbyte[len];
abt=asc.getBytes();
intj,k;
for(intp=0;p<asc.length()/2;p++){
if((abt[2*p]>='0')&&(abt[2*p]<='9')){
j=abt[2*p]-'0';
}elseif((abt[2*p]>='a')&&(abt[2*p]<='z')){
j=abt[2*p]-'a'+0x0a;
}else{
j=abt[2*p]-'A'+0x0a;
}
if((abt[2*p+1]>='0')&&(abt[2*p+1]<='9')){
k=abt[2*p+1]-'0';
}elseif((abt[2*p+1]>='a')&&(abt[2*p+1]<='z')){
k=abt[2*p+1]-'a'+0x0a;
}else{
k=abt[2*p+1]-'A'+0x0a;
}
inta=(j<<4)+k;
byteb=(byte)a;
bbt[p]=b;
}
returnbbt;
}
publicstaticvoidmain(String[]arg){
/**
*68656C6C6F0A
*C4E3BAC3
*/
String[]str={"C4","E3","BA","C3"};
//String[]str={"7E","02","04","00","07","10","00","00","00","00","13","08","4F","01","0B","0B","15","10","14","13","44","7E"};
byte[]b=newbyte[str.length];
for(inti=0;i<str.length;i++){
b[i]=hexStringToByte(str[i])[0];
}
System.out.println(newString(b));
StringstrC="你好";
Stringbth=bytesToHexString(strC.getBytes());
System.out.println(bth);
System.out.println(Short.MAX_VALUE);
System.out.println(Integer.toBinaryString(280));
}
}
以上所述是本文给大家分享的Android字符串和十六进制相互转化出现的中文乱码问题的相关内容,希望对大家有所帮助。