3 // Copyright (c) Microsoft Corporation. All rights reserved.
9 // <OWNER>Microsoft</OWNER>
11 * Operations to convert to and from Hex
15 namespace System.Security.Util
18 using System.Security;
19 using System.Diagnostics.Contracts;
20 internal static class Hex
22 // converts number to hex digit. Does not do any range checks.
23 static char HexDigit(int num) {
24 return (char)((num < 10) ? (num + '0') : (num + ('A' - 10)));
27 public static String EncodeHexString(byte[] sArray)
32 char[] hexOrder = new char[sArray.Length * 2];
35 for(int i = 0, j = 0; i < sArray.Length; i++) {
36 digit = (int)((sArray[i] & 0xf0) >> 4);
37 hexOrder[j++] = HexDigit(digit);
38 digit = (int)(sArray[i] & 0x0f);
39 hexOrder[j++] = HexDigit(digit);
41 result = new String(hexOrder);
46 internal static string EncodeHexStringFromInt(byte[] sArray) {
49 char[] hexOrder = new char[sArray.Length * 2];
51 int i = sArray.Length;
54 digit = (sArray[i] & 0xf0) >> 4;
55 hexOrder[j++] = HexDigit(digit);
56 digit = sArray[i] & 0x0f;
57 hexOrder[j++] = HexDigit(digit);
59 result = new String(hexOrder);
64 public static int ConvertHexDigit(Char val)
66 if (val <= '9' && val >= '0')
68 else if (val >= 'a' && val <= 'f')
69 return ((val - 'a') + 10);
70 else if (val >= 'A' && val <= 'F')
71 return ((val - 'A') + 10);
73 throw new ArgumentException( Environment.GetResourceString( "ArgumentOutOfRange_Index" ) );
77 public static byte[] DecodeHexString(String hexString)
79 if (hexString == null)
80 throw new ArgumentNullException( "hexString" );
81 Contract.EndContractBlock();
83 bool spaceSkippingMode = false;
86 int length = hexString.Length;
89 (hexString[0] == '0') &&
90 ( (hexString[1] == 'x') || (hexString[1] == 'X') ))
92 length = hexString.Length - 2;
96 // Hex strings must always have 2N or (3N - 1) entries.
98 if (length % 2 != 0 && length % 3 != 2)
100 throw new ArgumentException( Environment.GetResourceString( "Argument_InvalidHexFormat" ) );
105 if (length >=3 && hexString[i + 2] == ' ')
107 spaceSkippingMode = true;
109 // Each hex digit will take three spaces, except the first (hence the plus 1).
110 sArray = new byte[length / 3 + 1];
114 // Each hex digit will take two spaces
115 sArray = new byte[length / 2];
120 for (int j = 0; i < hexString.Length; i += 2, j++) {
121 rawdigit = ConvertHexDigit(hexString[i]);
122 digit = ConvertHexDigit(hexString[i+1]);
123 sArray[j] = (byte) (digit | (rawdigit << 4));
124 if (spaceSkippingMode)