`
hcmfys
  • 浏览: 357718 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

basic64

    博客分类:
  • java
阅读更多

 

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;

namespace basic64
{
    public class Basic64
    {

  
        private Hashtable hash = new Hashtable();
        private Encoding encoding;
        private char[] dataMapping ={ 
                     'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P', 
                     'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f', 
                     'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v', 
                     'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/',
                     '=' 
                    };

        public Basic64(Encoding encoding)
        {
            InitTable();
            this.encoding = encoding;
        }
        public Basic64()
        {
            InitTable();

            this.encoding = Encoding.GetEncoding("gb2312");
        }
        private void InitTable()
        {
            // A-Z 0-25
            for (int i = 0; i <= 25; i++)
            {
                string letter = "" + Convert.ToChar('A' + i);
                hash.Add(letter, i);
            }
            for (int i = 26; i <= 51; i++)
            {
                string letter = "" + Convert.ToChar('a' + i - 26);
                hash.Add(letter, i);
            }
            for (int i = 52; i <= 61; i++)
            {
                hash.Add("" + (i - 52), i);
            }

            hash.Add("+", 62);
            hash.Add("/", 63);
            hash.Add("=", 64);
        }

        /// <summary>
        /// basic64编码
        /// </summary>
        /// <param name="code"></param>
        /// <returns></returns>
        public string ToBase64(string code)
        {
            byte[] bytes = this.encoding.GetBytes(code);
            int size = (bytes.Length % 3 == 0) ? 3 : (bytes.Length % 3);
            byte[] buffer = new byte[bytes.Length + (3 - size)];
            string ret = "";
            Buffer.BlockCopy(bytes, 0, buffer, 0, bytes.Length);
            byte[] dBuffer = new byte[buffer.Length / 3 * 4];
            int j = 0;
            for (int i = 0; i < buffer.Length / 3; i++)
            {
                int q = i * 3;
                dBuffer[j] = (byte)((buffer[q] >> 2) & 0x3f);
                dBuffer[++j] = (byte)((((buffer[q] << 6) >> 2) & 0x3f) | (((buffer[q + 1] >> 4)) & 0x0f));
                dBuffer[++j] = (byte)(((buffer[q + 1] << 4 >> 2) & 0x3f) | ((buffer[q + 2] >> 6) & 0x03));
                dBuffer[++j] = (byte)((buffer[q + 2] << 2 >> 2) & 0x3f);
                j++;
            }
            for (int i = 0; i < dBuffer.Length - (3 - size); i++)
            {
                ret += dataMapping[(int)dBuffer[i]] + "";
            }
            if ((3 - size) > 0)
            {
                for (int i = 0; i < (3 - size); i++)
                    ret += '=';
            }
            return ret;
        }


        /// <summary>
        /// basic64解码
        /// </summary>
        /// <param name="code"></param>
        /// <returns></returns>
        public string FromBasic64(string code)
        {
            if (code.Length % 4 != 0) throw new Exception("不正确的Basic64编码长度!");
            byte[] buffer = new byte[code.Length / 4 * 3];
            int j = 0;
            int padCount = findPadStr(code);
            for (int i = 0; i < code.Length / 4; i++)
            {
                int q = i * 4;
                int _a = Convert.ToInt32(hash[code[q].ToString()]);
                int _b = Convert.ToInt32(hash[code[q + 1].ToString()]);
                int _c = Convert.ToInt32(hash[code[q + 2].ToString()]);
                int _d = Convert.ToInt32(hash[code[q + 3].ToString()]);

                string a = fill8bits(Convert.ToString(_a, 2)).Substring(2, 6);
                string b = fill8bits(Convert.ToString(_b, 2)).Substring(2, 6);
                string c = fill8bits(Convert.ToString(_c, 2)).Substring(2, 6);
                string d = fill8bits(Convert.ToString(_d, 2)).Substring(2, 6);

                buffer[j] = Convert.ToByte(a + b.Substring(0, 2), 2);
                buffer[++j] = Convert.ToByte(b.Substring(2, 4) + c.Substring(0, 4), 2);
                buffer[++j] = Convert.ToByte((c.Substring(4, 2) + d), 2);
                j++;
            }
            return this.encoding.GetString(buffer, 0, buffer.Length - padCount);
        }
        #region helper
        private string fill8bits(string str)
        {
            int len = str.Length;
            if (len < 8)
            {
                for (int i = 0; i < (8 - len); i++)
                    str = "0" + str;
            }
            return str;
        }
        private int findPadStr(string code)
        {
            int j = 0;
            int len = code.Length;
            for (int i = 0; i < 3; i++)
            {
                if (code.Substring(len - i - 1, 1).Equals("="))
                {
                    j++;
                }
            }
            return j;

        }
        #endregion
    }
}

 

分享到:
评论

相关推荐

    Java basic64 加密解密

    非常简单的一个读写 base64的类 base64就是 讯雷的那种加密的地址 利用了JDK中的类

    Visio basic64位win7等兼用

    总的来说,"Visio basic64位win7等兼用" 提供的是一款跨多个Windows版本的64位VB开发环境,适合对性能有较高要求的开发者,特别是那些熟悉或希望学习VB6的用户。尽管存在更新的技术替代品,但对于某些特定场景和遗留...

    Quick Basic x64版本,qb64v085-win

    随着技术的发展,Quick Basic逐渐推出了适用于现代操作系统的版本,比如标题中提到的"Quick Basic x64版本,qb64v085-win",这是一个专为64位Windows系统(包括win7、win8、win10)设计的版本。 这个x64版本的Quick...

    Visual Basic64迷你精简版

    直接安装,不需要破解使用起来非常好,节省内存; Visual Basic 6.0拥有图形用户界面(GUI)和快速应用程序开发(RAD)系统,可以轻易的使用DAO、RDO、ADO连接数据库,或者轻松的创建ActiveX控件。

    instantclient-basic-windows.x64-12.2.0.1.0。64位和32位的oracle instant client包

    在本案例中,我们讨论的是"Instantclient-basic-windows.x64-12.2.0.1.0",这是针对Windows操作系统的64位和32位版本。 1. **Oracle Instant Client的组成部分** Oracle Instant Client通常包括以下组件: - ...

    官方原版PL/SQL1206X64 +instantclient-basic-windows.x64-12.2.0.1.0+中文语言包

    在本资源中,我们看到的是官方原版的PL/SQL Developer 12.06的64位版本,以及与之配套的Oracle Instant Client基本组件和中文语言包。这个组合使得用户能够在中国语境下更方便地进行Oracle数据库的管理和开发工作。 ...

    instantclient-basic-windows.x64-12.2.0.1.0

    Oracle 数据库远程连接轻量级客户端 Instant Client Downloads for Microsoft Windows (x64)

    Microsoft Quick Basic 7.1安装版

    Microsoft Quick Basic 7.1是微软公司在DOS操作系统环境下推出的一款基础编程工具,它为初学者和专业开发者提供了一个简洁而强大的编程环境。这个版本在当时的个人计算机领域中具有广泛的影响力,是许多程序员入门...

    C#图片与ase64之间的转换

    C#图片和Basic64的相互转换,方便数据库的存储

    c64_game_programming_tutorial:我的XC = Basic C64 Text Adventure引擎用于教程

    Commdore C64编程和XC = Basic C64 Text Adventure引擎蝙蝠和球精灵游戏演示 batball.bas基本代码batball.prg编译的prg bat.bin蝙蝠精灵ball.bin球精灵c64文字冒险游戏引擎 c64-text-adventure.prg是当前正在编译的...

    最新 instantclient-basic-linux.x64-11.2.0.4.0

    最新 instantclient-basic-linux.x64-11.2.0.4.0最新 instantclient-basic-linux.x64-11.2.0.4.0最新 instantclient-basic-linux.x64-11.2.0.4.0最新 instantclient-basic-linux.x64-11.2.0.4.0最新 instantclient-...

    confd-basic-7.6.linux.x86_64

    1. 解压 sh confd-basic-7.6.linux.x86_64.installer.bin /home/tmpconfd 2. 编译crypto.so 修改 confd-basic-7.6.linux.x86_64/confd-basic-7.6/libconfd/src/include.mk cd confd-basic-7.6.linux.x86_64/confd-...

    instantclient-basic-64-for-windows

    basic-64-for-windows.txtinstantclient-basic-64-for-windows.txtinstantclient-basic-64-for-windows.txtinstantclient-basic-64-for-windows.txtinstantclient-basic-64-for-windows.txtinstantclient-basic-64-...

    instantclient-basic-windows.x64-12.1.0.2.0 解决Navicat 15 64位 连Oracle 11.2.0.4

    适合最新Navicate 15 64位使用,解决连接Oracle 11g 64位时 Oracle library is not loaded,经测试instantclient-basic-windows.x64-11.2.0.4.0死活连接不上 不要被误导。换12.1完美解决。 32位的navicate 可以用...

    oracle官方精简64位客户端-instantclient-basic-windows.x64-11.2.0.2.0

    Instant Client Package - Basic: All files... instantclient-basic-windows.x64-11.2.0.4.0.zip (54,956,947 bytes) Instant Client 程序包 — Basic(win64位): 运行 OCI、OCCI 和 JDBC-OCI 应用程序所需的所有文件

    instantclient-basiclite/basic-linux.x64-12.2.0.1.0.zip

    oracle 数据库驱动 instantclient-basic-linux.x64-12.2.0.1.0.zip instantclient-basiclite-linux.x64-12.2.0.1.0.zip

    instantclient-basic-windows.x64-19.8.0.0.0dbru

    instantclient-basic-windows.x64-19.8.0.0.0dbru 是 Oracle 数据库 Instant Client 的一个特定版本和配置的下载包名称。 Instant Client:Oracle Instant Client 是一个轻量级的客户端库,它允许应用程序连接到...

    oracle官方64位客户端-instantclient-basic-windows.x64-11.2.0.4.0.zip

    标题中的“64位客户端-instantclient-basic-windows.x64-11.2.0.4.0.zip”表明这是一个针对64位Windows系统的Oracle Instant Client基础版,版本号为11.2.0.4.0。这个压缩包包含了运行在Windows平台上,与64位Oracle...

    instantclient-basic-windows.x64-12.2.0.1.0.zip

    instantclient-basic-windows.x64-12.2.0.1.0,免去安装本地oracle数据库,配合第三方连接工具(如navicat for oracle)简单配置即可连接上项目开发库。 关于 Navicat 连接Oracel出现 probable Oracel ...

    instantclient-basic-win64-10.2.0.5.zip

    oracle10g 64位免安装客户端 使用步骤: (1)下载解压 将下载后的文件instantclient-basic-win32-11.2.0.1.0解压,把解压后的文件夹instantclient_11_2置于C:\Program Files下 (2)环境变量设置 配置环境变量,...

Global site tag (gtag.js) - Google Analytics