跟某公司能力對接對方為java 使用 bcprov-jdk16-143.jar包中的方法 Hex.decode() 對一段16進制的字串進行解碼,我現要用.net實作這個方法,失敗,無法進行后續作業,望大神指點。
除錯結果如下:
var hexString= "6ff5cb38ddef84d5b7fdaadcbe249061";
//csdn大神代碼,輸出結果為:111-245-203-56-221-239-132-213-183-253-170-220-190-36-144-97 (ToString()拼接,數字為位元組值)
//與Hex.decode(),輸出不一致:111-11-5356-35-17-124-43-73-3-86-36-6636-11297
public static byte[] ToHex(this string hexString)
{
var datas = new byte[hexString.Length / 2];
var j = 0;
for (var i = 0; i < hexString.Length; i += 2)
datas[j++] = Convert.ToByte(hexString.Substring(i, 2), 16);
return datas;
}
Hex.decode() 代碼如下
public static byte[] decodeHexUpper(String str) throws UnsupportedEncodingException {
return Hex.decode(str.toLowerCase(Locale.US));
}
對jar包進行反編譯獲得 Hex.decode()原始碼為
public int decode(final String s, final OutputStream outputStream) throws IOException {
int n = 0;
int length;
for (length = s.length(); length > 0 && ignore(s.charAt(length - 1)); --length) {}
int i = 0;
while (i < length) {
while (i < length && ignore(s.charAt(i))) {
++i;
}
byte b;
for (b = this.decodingTable[s.charAt(i++)]; i < length && ignore(s.charAt(i)); ++i) {}
final byte b2 = this.decodingTable[s.charAt(i++)];
if ((b | b2) < 0) {
throw new IOException("invalid characters encountered in Hex string");
}
outputStream.write(b << 4 | b2);
++n;
}
return n;
}
uj5u.com熱心網友回復:
java代碼public static byte[] decodeHexUpper(String str) throws UnsupportedEncodingException是不能輸出111-11-5356-35...的。因為byte最大值為255,顯然5356不能是byte的輸出。
可能你要檢查是否java的輸出例子有誤。
java Hex.decode()原始碼有跳過非Hex字符的處理,這是你C#實作沒有的。
舉個例子, Hex.decode()可以解碼"6f f5 cb ",你的C#不能。目前只看到這個小區別。
uj5u.com熱心網友回復:
github_36000833抱歉 更正下java輸出:111 -11 -53 56 -35 -17 -124 -43 -73 -3 -86 -36 -66 36 -112 97 - 是負數
同時更正下C#輸出:111 245 203 56 221 239 132 213 183 253 170 220 190 36 144 97
這有什么辦法可以分析下了
uj5u.com熱心網友回復:
byte --> sbyte
var datas = new sbyte[hexString.Length / 2];
var j = 0;
for (var i = 0; i < hexString.Length; i += 2)
datas[j++] = Convert.ToSByte(hexString.Substring(i, 2), 16);
uj5u.com熱心網友回復:
??有符號數,那是sbyte,不是byteuj5u.com熱心網友回復:
還是用你C#的ToHex(this string hexString)實作,列印的時候顯示成有符號的輸出。
static void Main()
{
var hexString = "6ff5cb38ddef84d5b7fdaadcbe249061";
var bytes = hexString.ToHex();
//輸出 111 -11 -53 56 -35 -17 -124 -43 -73 -3 -86 -36 -66 36 -112 97
Console.WriteLine(string.Join(" ", bytes.Select(x => (sbyte)x)));
}
至于為什么245 203,換成有符號數成了-11 -53,你可以搜索有關‘2補碼’等知識。
256 - 11 = 245
256 - 53 = 203
uj5u.com熱心網友回復:
樓上正解,顯示輸出的問。實際上,你的轉換是沒問題的。uj5u.com熱心網友回復:
C#中,byte為無符號8位整數,而Sbyte為有符號8位整數,對應java中的byte型別。轉載請註明出處,本文鏈接:https://www.uj5u.com/net/106090.html
標籤:C#
上一篇:又哭了
