The Labs \ Source Viewer \ SSCLI \ System.Security.Util \ Hex

  1. // ==++==
  2. //
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. //
  14. // ==--==
  15. /*
  16. * Hex.cs
  17. *
  18. * Operations to convert to and from Hex
  19. *
  20. */
  21. namespace System.Security.Util
  22. {
  23.     using System;
  24.     using System.Security;
  25.     static internal class Hex
  26.     {
  27.         // converts number to hex digit. Does not do any range checks.
  28.         static char HexDigit(int num)
  29.         {
  30.             return (char)((num < 10) ? (num + '0') : (num + ('A' - 10)));
  31.         }
  32.        
  33.         public static string EncodeHexString(byte[] sArray)
  34.         {
  35.             string result = null;
  36.            
  37.             if (sArray != null) {
  38.                 char[] hexOrder = new char[sArray.Length * 2];
  39.                
  40.                 int digit;
  41.                 for (int i = 0int j = 0; i < sArray.Length; i++) {
  42.                     digit = (int)((sArray[i] & 240) >> 4);
  43.                     hexOrder[j++] = HexDigit(digit);
  44.                     digit = (int)(sArray[i] & 15);
  45.                     hexOrder[j++] = HexDigit(digit);
  46.                 }
  47.                 result = new string(hexOrder);
  48.             }
  49.             return result;
  50.         }
  51.        
  52.         static internal string EncodeHexStringFromInt(byte[] sArray)
  53.         {
  54.             string result = null;
  55.             if (sArray != null) {
  56.                 char[] hexOrder = new char[sArray.Length * 2];
  57.                
  58.                 int i = sArray.Length;
  59.                 int digit;
  60.                 int j = 0;
  61.                 while (i-- > 0) {
  62.                     digit = (sArray[i] & 240) >> 4;
  63.                     hexOrder[j++] = HexDigit(digit);
  64.                     digit = sArray[i] & 15;
  65.                     hexOrder[j++] = HexDigit(digit);
  66.                 }
  67.                 result = new string(hexOrder);
  68.             }
  69.             return result;
  70.         }
  71.        
  72.         public static int ConvertHexDigit(char val)
  73.         {
  74.             if (val <= '9' && val >= '0')
  75.                 return (val - '0');
  76.             else if (val >= 'a' && val <= 'f')
  77.                 return ((val - 'a') + 10);
  78.             else if (val >= 'A' && val <= 'F')
  79.                 return ((val - 'A') + 10);
  80.             else
  81.                 throw new ArgumentException(Environment.GetResourceString("ArgumentOutOfRange_Index"));
  82.         }
  83.        
  84.        
  85.         public static byte[] DecodeHexString(string hexString)
  86.         {
  87.             if (hexString == null)
  88.                 throw new ArgumentNullException("hexString");
  89.            
  90.             bool spaceSkippingMode = false;
  91.            
  92.             int i = 0;
  93.             int length = hexString.Length;
  94.            
  95.             if ((length >= 2) && (hexString[0] == '0') && ((hexString[1] == 'x') || (hexString[1] == 'X'))) {
  96.                 length = hexString.Length - 2;
  97.                 i = 2;
  98.             }
  99.            
  100.             // Hex strings must always have 2N or (3N - 1) entries.
  101.            
  102.             if (length % 2 != 0 && length % 3 != 2) {
  103.                 throw new ArgumentException(Environment.GetResourceString("Argument_InvalidHexFormat"));
  104.             }
  105.            
  106.             byte[] sArray;
  107.            
  108.             if (length >= 3 && hexString[i + 2] == ' ') {
  109.                 spaceSkippingMode = true;
  110.                
  111.                 // Each hex digit will take three spaces, except the first (hence the plus 1).
  112.                 sArray = new byte[length / 3 + 1];
  113.             }
  114.             else {
  115.                 // Each hex digit will take two spaces
  116.                 sArray = new byte[length / 2];
  117.             }
  118.            
  119.             int digit;
  120.             int rawdigit;
  121.             for (int j = 0; i < hexString.Length; i += 2,j++) {
  122.                 rawdigit = ConvertHexDigit(hexString[i]);
  123.                 digit = ConvertHexDigit(hexString[i + 1]);
  124.                 sArray[j] = (byte)(digit | (rawdigit << 4));
  125.                 if (spaceSkippingMode)
  126.                     i++;
  127.             }
  128.             return (sArray);
  129.         }
  130.     }
  131. }

Developer Fusion