今天遇到个麻烦。
由于产品版本管理和兼容性处理不当,在产品升级的时候和其他产品对接出错。由于是N年前的产品,已经无法查看当初配置。只好抓包对数据。其中遇到一个小插曲,通过Tcpdump数据虽然抓到了,其中部分关键项是中文,用wireshark打开显示一串点。这是遇到乱码了(后来发现,其实只要另存为以下就可以正常显示了)!
想着找个在线转码工具,试了几个都转不了。只能尝试用代码处理,开始找资料,发现其实有不止一种处理方法。
首先用UE打开,能看到UTF-8的十六进制数据。
【方法1】用shell
【方法2】写代码实现
public class Test {
public static String str2Hex(String str) throws UnsupportedEncodingException {
String hexRaw = String.format("%x", new BigInteger(1, str.getBytes("UTF-8")));
char[] hexRawArr = hexRaw.toCharArray();
StringBuilder hexFmtStr = new StringBuilder();
final String SEP = "\\x";
for (int i = 0; i < hexRawArr.length; i++) {
hexFmtStr.append(SEP).append(hexRawArr[i]).append(hexRawArr[++i]);
}
return hexFmtStr.toString();
}
public static String hex2Str(String str) throws UnsupportedEncodingException {
String strArr[] = str.split("\\\\"); // 分割拿到形如 xE9 的16进制数据
byte[] byteArr = new byte[strArr.length - 1];
for (int i = 1; i < strArr.length; i++) {
Integer hexInt = Integer.decode("0" + strArr[i]);
byteArr[i - 1] = hexInt.byteValue();
}
return new String(byteArr, "UTF-8");
}
public static void main(String[] args) throws UnsupportedEncodingException {
System.out.println(str2Hex("中国1a23"));
System.out.println(hex2Str(str2Hex("中国1a23")));
System.out.println(hex2Str("\\xE9\\xBB\\x84\\xE8\\x8A\\xB1\\xE6\\xA2\\xA8\\xE5\\xAE\\xB6\\xE5\\x85\\xB7\\xE8\\xBD\\xAC\\xE8\\xAE\\xA9"));
}
}
结果:
\xe4\xb8\xad\xe5\x9b\xbd\x31\x61\x32\x33
中国1a23
黄花梨家具转让
下面再来看看 unicode 形式怎么在 java 中转换:
String string = "中国\u6211\u7231\u5317\u4EAC";
byte[] utf8 = string.getBytes("UTF-8");
string = new String(utf8, "UTF-8");
System.out.println(string);
链接
https://my.oschina.net/leejun2005/blog/106791
http://www.cnblogs.com/developerY/p/3575271.html
http://stackoverflow.com/questions/28086916/encode-decode-hex-to-utf-8-string
相关推荐
这里,`encode('utf-8')`将字符串按照UTF-8编码转换为字节,然后`.hex()`方法将这些字节转换为16进制字符串。 **16进制字节转字符串:** 反之,如果我们有一个16进制字节序列,想要将其还原为字符串,我们需要先将...
在Android中,将字符串转换成16进制的常见方法是遍历字符串中的每个字符,将其ASCII码转换为16进制字符串。以下是一个简单的示例: ```java public String stringToHex(String input) { StringBuilder sb = new ...
比如,汉字"汉"在UTF-8编码下的二进制形式是E6B187,将其转换为16进制,就是E6B187。 转换过程分为两步:首先,将汉字转换为对应的Unicode码点,这一步可以通过查找Unicode字符表完成;然后,将Unicode码点转换为16...
在Android系统中,大部分应用使用UTF-8编码进行字符串处理,因此我们主要探讨基于UTF-8的汉字到16进制转换。 1. 字符编码与Unicode: 汉字在计算机中的基础是Unicode编码,Unicode是一个通用的字符集,包含世界上...
这个问题的根源在于Java和Android默认使用不同的字符编码,如GBK或UTF-8,而十六进制转换通常基于ASCII,不包含全部Unicode字符,特别是中文字符。 在给定的代码示例中,`StringToSixthUtils` 类提供了两个静态方法...
因此,将字符串转换为16进制码的过程实际上就是将字符串中每个字符的编码转换成16进制的形式。 在Python编程语言中,可以使用内置的`hex()`函数或者`ord()`和`format()`函数组合来实现这个转换。例如,对于一个字符...
首先,字符串被编码为字节序列(通常使用ASCII或UTF-8),然后对每个字节执行CRC16算法。每个字节都会与当前CRC值异或,然后根据生成多项式进行移位操作。如果最高位为1,则CRC值减去生成多项式(再次进行移位操作)...
Java中的字符串通常需要先编码为特定的字符集,如UTF-8: ```java String input = "your_string"; byte[] bytes = input.getBytes("UTF-8"); ``` 4. 使用`update()`方法将数据分块加入到MD5处理中,最后调用`...
例如,从UTF-8编码的字符串转换成GBK编码,需要先解码成Unicode,然后再按照GBK的规则编码。 5. **16进制表示**:在计算机中,数据通常以二进制形式存在,但为了方便人类读取,我们可以将其转换成16进制表示。每个...
总结来说,Java中的SHA-256加密算法实现涉及使用`MessageDigest`类创建SHA-256实例,更新输入数据,然后获取并转换哈希值。这个过程既简单又强大,为数据安全提供了重要的保障。在实际应用中,可以对文本、文件等...
5. **转换为字符串**:使用`new String(baKeyword, "utf-8")`将字节数组转换为字符串。 6. **返回结果**:返回最终的字符串。 ```java public static String toStringHex(String s) { byte[] baKeyword = new byte...
在这里,我们特别关注128位密钥长度的AES加密,使用ECB(Electronic Codebook)模式,配合PKCS5Padding填充策略,以及数据编码的BASE64和HEX转换。 首先,AES加密是一种分组密码,它将明文数据分成固定大小的块进行...
Apache Commons Codec的URLCodec类实现了这个功能,包括对UTF-8和其他字符集的支持。 5. **版本迭代的改进**: - 从1.1到1.10,Apache Commons Codec经历了多次更新,每次升级都可能引入性能优化、bug修复或新特性...
这里我们使用UTF-8编码将字符串转换为字节数组,然后更新MD5实例。 4. 计算哈希值: ```java byte[] digest = md.digest(); ``` `digest()`方法返回一个16字节的数组,表示MD5哈希值。 5. 将哈希值转换为16...
byte[] outByte = md5.digest(strSrc.getBytes("UTF-8")); // 将字节数组转换为十六进制表示的字符串 StringBuilder hexString = new StringBuilder(); for (byte b : outByte) { String hex = Integer....
5. **CharEncodings**:提供了各种字符编码的枚举,如ISO-8859-1、UTF-8等,方便在处理字符串编码问题时进行转换。 6. **语言编码**:如BCD编码之外,还有其他语言特有编码的支持,例如中文GB2312、GBK等,方便在...
散列值是一个字节数组,我们将其转换为16进制字符串以方便阅读和比较。 例如,如果我们想要对字符串"Hello, World!"进行SHA1加密,可以这样调用: ```java String input = "Hello, World!"; String sha1Hash = sha...
- 通过`str.getBytes("utf-8")`将待加密的字符串转换为字节数组,这里指定了字符编码为UTF-8。 - 调用`digest()`方法对字节数组进行加密处理,得到加密后的字节数组。 - 使用`Hex.encodeHex()`方法将加密后的字节...
MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,它能够将任意长度的输入数据转换成固定长度的128位(16字节)摘要值,通常以32位的十六进制字符串表示。在Java中,我们可以使用`java.security....
在Java中,字符串通常是UTF-8编码,因此需要使用`string.getBytes("UTF-8")`获取字节数组。 4. 计算摘要:更新完数据后,调用`digest`方法计算MD5摘要。`digest`方法会返回一个16字节的数组,表示MD5的二进制值。 ...