The Labs \ Source Viewer \ SSCLI \ System.Xml \ BinHexEncoder

  1. //------------------------------------------------------------------------------
  2. // <copyright file="BinHexEncoder.cs" company="Microsoft">
  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. // </copyright>
  14. //------------------------------------------------------------------------------
  15. namespace System.Xml
  16. {
  17.     internal abstract class BinHexEncoder
  18.     {
  19.        
  20.         private const string s_hexDigits = "0123456789ABCDEF";
  21.         private const int CharsChunkSize = 128;
  22.        
  23.         static internal void Encode(byte[] buffer, int index, int count, XmlWriter writer)
  24.         {
  25.             if (buffer == null) {
  26.                 throw new ArgumentNullException("buffer");
  27.             }
  28.             if (index < 0) {
  29.                 throw new ArgumentOutOfRangeException("index");
  30.             }
  31.             if (count < 0) {
  32.                 throw new ArgumentOutOfRangeException("count");
  33.             }
  34.             if (count > buffer.Length - index) {
  35.                 throw new ArgumentOutOfRangeException("count");
  36.             }
  37.            
  38.             char[] chars = new char[(count * 2) < CharsChunkSize ? (count * 2) : CharsChunkSize];
  39.             int endIndex = index + count;
  40.             while (index < endIndex) {
  41.                 int cnt = (count < CharsChunkSize / 2) ? count : CharsChunkSize / 2;
  42.                 int charCount = Encode(buffer, index, cnt, chars);
  43.                 writer.WriteRaw(chars, 0, charCount);
  44.                 index += cnt;
  45.                 count -= cnt;
  46.             }
  47.         }
  48.        
  49.         static internal string Encode(byte[] inArray, int offsetIn, int count)
  50.         {
  51.             if (null == inArray) {
  52.                 throw new ArgumentNullException("inArray");
  53.             }
  54.             if (0 > offsetIn) {
  55.                 throw new ArgumentOutOfRangeException("offsetIn");
  56.             }
  57.             if (0 > count) {
  58.                 throw new ArgumentOutOfRangeException("count");
  59.             }
  60.             if (count > inArray.Length - offsetIn) {
  61.                 throw new ArgumentOutOfRangeException("count");
  62.             }
  63.            
  64.             char[] outArray = new char[2 * count];
  65.             int lenOut = Encode(inArray, offsetIn, count, outArray);
  66.             return new string(outArray, 0, lenOut);
  67.         }
  68.        
  69.         private static int Encode(byte[] inArray, int offsetIn, int count, char[] outArray)
  70.         {
  71.             int curOffsetOut = 0;
  72.             int offsetOut = 0;
  73.             byte b;
  74.             int lengthOut = outArray.Length;
  75.            
  76.             for (int j = 0; j < count; j++) {
  77.                 b = inArray[offsetIn++];
  78.                 outArray[curOffsetOut++] = s_hexDigits[b >> 4];
  79.                 if (curOffsetOut == lengthOut) {
  80.                     break;
  81.                 }
  82.                 outArray[curOffsetOut++] = s_hexDigits[b & 15];
  83.                 if (curOffsetOut == lengthOut) {
  84.                     break;
  85.                 }
  86.             }
  87.             return curOffsetOut - offsetOut;
  88.         }
  89.         // function
  90.     }
  91.     // class
  92. }
  93. // namespace

Developer Fusion