在Java中,将十六进制转换为字节数组与C#.NET[从C#到Java的端口]给出的结果不同
我正在尝试将一小段代码从C#转换为Java。[我想不必说我是个傻瓜。:P] 下面的两个代码返回的结果不同,我不明白为什么。谢谢你的帮助 注:我已经检查了这个问题,但答案并不能解决我的问题 C#NET在Java中,将十六进制转换为字节数组与C#.NET[从C#到Java的端口]给出的结果不同,java,c#,hex,byte,Java,C#,Hex,Byte,我正在尝试将一小段代码从C#转换为Java。[我想不必说我是个傻瓜。:P] 下面的两个代码返回的结果不同,我不明白为什么。谢谢你的帮助 注:我已经检查了这个问题,但答案并不能解决我的问题 C#NET 公共类测试 { 专用静态sbyte[]十六进制字节(字符串十六进制) { 如果(十六进制长度%2==1) 抛出新异常(“二进制键不能有奇数位数”); sbyte[]arr=新的sbyte[hex.Length>>1]; int l=十六进制长度; 对于(int i=0;i>1);+i) { arr[
公共类测试
{
专用静态sbyte[]十六进制字节(字符串十六进制)
{
如果(十六进制长度%2==1)
抛出新异常(“二进制键不能有奇数位数”);
sbyte[]arr=新的sbyte[hex.Length>>1];
int l=十六进制长度;
对于(int i=0;i<(l>>1);+i)
{
arr[i]=(sbyte)((GetHexVal(hex[i>1);+i)
{
arr[i]=(byte)((GetHexVal)((char)(hex.charAt)(i问题在于您将Java代码中的第一个字符括起来。下面是您的代码:
GetHexVal((char)(hex.charAt(i << 1) << 4))
如果您让代码更简单,这将更容易理解。我会将其编写为:
private static byte[] HexToByte(String hex) {
if (hex.length() % 2 == 1) {
throw new IllegalArgumentException("...");
}
byte[] arr = new byte[hex.length() / 2];
for (int i = 0; i < hex.length(); i += 2)
{
int highNybble = parseHex(hex.charAt(i));
int lowNybble = parseHex(hex.charAt(i + 1));
arr[i / 2] = (byte) ((highNybble << 4) + lowNybble);
}
return arr;
}
私有静态字节[]十六进制字节(字符串十六进制){
如果(十六进制长度()%2==1){
抛出新的IllegalArgumentException(“…”);
}
字节[]arr=新字节[hex.length()/2];
对于(int i=0;iGetHexVal((char)(hex.charAt(i << 1) << 4))
// Unnecessary cast removed
GetHexVal(hex.charAt(i << 1)) << 4
private static byte[] HexToByte(String hex) {
if (hex.length() % 2 == 1) {
throw new IllegalArgumentException("...");
}
byte[] arr = new byte[hex.length() / 2];
for (int i = 0; i < hex.length(); i += 2)
{
int highNybble = parseHex(hex.charAt(i));
int lowNybble = parseHex(hex.charAt(i + 1));
arr[i / 2] = (byte) ((highNybble << 4) + lowNybble);
}
return arr;
}