2009-09-22 50 views
2

可能重複:
How to convert hex to a byte array?有沒有C#等同於Python的unhexlify?

我在尋找在C#中蟒蛇兼容的方法,以十六進制轉換爲二進制。

import sha 
import base64 
import binascii 

hexvalue = "5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8" 
binaryval = binascii.unhexlify(hexvalue) 
print base64.standard_b64encode(binaryval) 
>> W6ph5Mm5Pz8GgiULbPgzG37mj9g= 

到目前爲止,所有的各種Hex2Binary C#方法,我發現最終會把OverflowExceptions:我做這個顛倒Python中的散列

static string Hex2Binary(string hexvalue) 
{ 
    string binaryval = ""; 
    long b = Convert.ToInt64(hexvalue, 16); 
    binaryval = Convert.ToString(b); 
    byte[] bytes = Encoding.UTF8.GetBytes(binaryval); 
    return Convert.ToBase64String(bytes); 
} 

任何人有一個提示如何生成一個C#方法來匹配python輸出?

+0

http://stackoverflow.com/questions/854012/how-to-convert-hex-to-a-byte-array – 2009-09-22 09:25:51

+0

(使用Convert.ToBase64String的複製與所得到的字節數組,btw。) – 2009-09-22 09:26:22

+0

這不是重複的IMO,這是針對Python和C#之間的兼容性。答案可能是一樣的,但問題(其他人可能會偶然發現)肯定是不同的。 – RyanW 2009-09-22 10:02:32

回答

3

該值是太大了很長(64位),這就是爲什麼你會得到一個OverflowException。

但它很容易通過字節(當然,由四位半字節實際上)爲十六進制轉換爲二進制字節:

static string Hex2Binary(string hexvalue) 
{ 
    StringBuilder binaryval = new StringBuilder(); 
    for(int i=0; i < hexvalue.Length; i++) 
    { 
     string byteString = hexvalue.Substring(i, 1); 
     byte b = Convert.ToByte(byteString, 16); 
     binaryval.Append(Convert.ToString(b, 2).PadLeft(4, '0')); 
    } 
    return binaryval.ToString(); 
} 

編輯:上面的方法轉換爲二進制,而不是爲base64。這一個轉換爲base64:

static string Hex2Base64(string hexvalue) 
{ 
    if (hexvalue.Length % 2 != 0) 
     hexvalue = "0" + hexvalue; 
    int len = hexvalue.Length/2; 
    byte[] bytes = new byte[len]; 
    for(int i = 0; i < len; i++) 
    { 
     string byteString = hexvalue.Substring(2 * i, 2); 
     bytes[i] = Convert.ToByte(byteString, 16); 
    } 
    return Convert.ToBase64String(bytes); 
} 
+0

現在做它的相反端? :) – leppie 2009-09-22 09:39:01

+0

他需要將其轉換爲相反的endian嗎?只有在需要的時候纔會這樣做我說;-) – 2009-09-22 09:50:31

+0

我需要增加2,而不是1我認爲。 – Codingday 2010-09-24 16:17:33

1

您可以將您的十六進制字符串分成兩位數組,然後使用byte.parse將它們轉換爲字節。使用NumberStyles.AllowHexSpecifier的,例如:

byte.Parse("3F", NumberStyles.AllowHexSpecifier); 

下面的程序將十六進制字符串轉換爲字節數組:

private byte[] Hex2Binary(string hex) 
{ 
    var chars = hex.ToCharArray(); 
    var bytes = new List<byte>(); 
    for(int index = 0; index < chars.Length; index += 2) { 
     var chunk = new string(chars, index, 2); 
     bytes.Add(byte.Parse(chunk, NumberStyles.AllowHexSpecifier)); 
    } 
    return bytes.ToArray(); 
}