Base64.cs
上传用户:szltgg
上传日期:2019-05-16
资源大小:604k
文件大小:4k
源码类别:

Telnet服务器

开发平台:

C#

  1. /*
  2.  Copyright (c) 2005 Poderosa Project, All Rights Reserved.
  3.  This file is a part of the Granados SSH Client Library that is subject to
  4.  the license included in the distributed package.
  5.  You may not use this file except in compliance with the license.
  6.  $Id: Base64.cs,v 1.2 2005/04/20 08:58:56 okajima Exp $
  7. */
  8. using System;
  9. namespace Granados.Toolkit {
  10. public class Base64 {
  11. private static readonly int[] _fromBase64 = new int[] {
  12.    -1, -1, -1, -1, -1, -1, -1, -1,
  13.    -1, -1, -1, -1, -1, -1, -1, -1,
  14.    -1, -1, -1, -1, -1, -1, -1, -1,
  15.    -1, -1, -1, -1, -1, -1, -1, -1,
  16.    -1, -1, -1, -1, -1, -1, -1, -1,
  17.    -1, -1, -1, 62, -1, -1, -1, 63,
  18.    52, 53, 54, 55, 56, 57, 58, 59,
  19.    60, 61, -1, -1, -1, -1, -1, -1,
  20.    -1,  0,  1,  2,  3,  4,  5,  6,
  21.    7,  8,  9, 10, 11, 12, 13, 14,
  22.    15, 16, 17, 18, 19, 20, 21, 22,
  23.    23, 24, 25, -1, -1, -1, -1, -1,
  24.    -1, 26, 27, 28, 29, 30, 31, 32,
  25.    33, 34, 35, 36, 37, 38, 39, 40,
  26.    41, 42, 43, 44, 45, 46, 47, 48,
  27.    49, 50, 51, -1, -1, -1, -1, -1
  28.    };
  29. private static readonly byte[] _toBase64 = new byte[] {
  30.    // 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
  31.    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
  32.    // 'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',
  33.    81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98, 99,100,101,102,
  34.    // 'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',
  35.    103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,
  36.    // 'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/'
  37.    119,120,121,122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, (byte)'='
  38.    };
  39. private const int PAD = 64;
  40. public static byte[] Encode(byte[] data) {
  41. return Encode(data, 0, data.Length);
  42. }
  43. public static byte[] Decode(byte[] data) {
  44. return Decode(data, 0, data.Length);
  45. }
  46. public static byte[] Decode(byte[] encoded, int offset, int length) {
  47. int j, c, v;
  48. int bits = 0;
  49. int n    = offset + length;
  50. byte[] data = new byte[(length * 3) / 4];
  51. v = 0;
  52. j = 0;
  53. for(int i = offset; i < n; i++) {
  54. c = _fromBase64[encoded[i]];
  55. if(c < 0) {
  56. if(encoded[i] == _toBase64[PAD])
  57. break;
  58. continue;
  59. }
  60. v = (v << 6) | c;
  61. bits += 6;
  62. if(bits >= 8) {
  63. bits -= 8;
  64. data[j++] = (byte) ((v >> bits) & 0xff);
  65. }
  66. }
  67. if(data.Length > j) {
  68. byte[] temp = new byte[j];
  69. Array.Copy(data, 0, temp, 0, j);
  70. data = temp;
  71. }
  72. return data;
  73. }
  74. public static byte[] Encode(byte[] data, int offset, int length) {
  75. byte[] encoded;
  76. int x1, x2, x3, x4;
  77. int i, j, r, n;
  78. r       = length % 3;
  79. n       = offset + (length - r);
  80. encoded = new byte[((length / 3) * 4) + (r != 0 ? 4 : 0)];
  81. for(i = offset, j = 0; i < n; i += 3, j += 4) {
  82. x1 = (data[i] & 0xfc) >> 2;
  83. x2 = (((data[i    ] & 0x03) << 4) | ((data[i + 1] & 0xf0) >> 4));
  84. x3 = (((data[i + 1] & 0x0f) << 2) | ((data[i + 2] & 0xc0) >> 6));
  85. x4 = (data[i + 2] & 0x3f);
  86. encoded[j    ] = _toBase64[x1];
  87. encoded[j + 1] = _toBase64[x2];
  88. encoded[j + 2] = _toBase64[x3];
  89. encoded[j + 3] = _toBase64[x4];
  90. }
  91. if(r != 0) {
  92. x1 = (data[i] & 0xfc) >> 2;
  93. x2 = (data[i] & 0x03) << 4;
  94. x3 = PAD;
  95. x4 = PAD;
  96. if(r == 2) {
  97. x2 |= ((data[i + 1] & 0xf0) >> 4);
  98. x3 = (data[i + 1] & 0x0f) << 2;
  99. }
  100. encoded[j++] = _toBase64[x1];
  101. encoded[j++] = _toBase64[x2];
  102. encoded[j++] = _toBase64[x3];
  103. encoded[j++] = _toBase64[x4];
  104. }
  105. return encoded;
  106. }
  107. //for test
  108. public static void test() {
  109. string t = "hernan crespo";
  110. string s = System.Text.Encoding.ASCII.GetString(Decode(Encode(System.Text.Encoding.ASCII.GetBytes(t))));
  111. }
  112. }
  113. }