Base32解码

2023-11-30

我有一个 base32 字符串,需要将其转换为字节数组。我在 .NET 框架中找不到转换方法。我可以找到适用于 Base64 的方法,但找不到适用于 Base32 的方法。

Convert.FromBase64String– 对于 base32 这样的东西将是完美的。

框架中有这样的方法还是我必须自己推出?


我需要一个 Base32 编码器/解码器,所以今天下午我花了几个小时把它放在一起。我相信它符合此处列出的标准:https://www.rfc-editor.org/rfc/rfc4648#section-6.

public class Base32Encoding
{
    public static byte[] ToBytes(string input)
    {
        if (string.IsNullOrEmpty(input))
        {
            throw new ArgumentNullException("input");
        }

        input = input.TrimEnd('='); //remove padding characters
        int byteCount = input.Length * 5 / 8; //this must be TRUNCATED
        byte[] returnArray = new byte[byteCount];
        
        byte curByte = 0, bitsRemaining = 8;
        int mask = 0, arrayIndex = 0;

        foreach (char c in input)
        {
            int cValue = CharToValue(c);

            if (bitsRemaining > 5)
            {
                mask = cValue << (bitsRemaining - 5);
                curByte = (byte)(curByte | mask);
                bitsRemaining -= 5;
            }
            else
            {
                mask = cValue >> (5 - bitsRemaining);
                curByte = (byte)(curByte | mask);
                returnArray[arrayIndex++] = curByte;
                curByte = (byte)(cValue << (3 + bitsRemaining));
                bitsRemaining += 3;
            }
        }

        //if we didn't end with a full byte
        if (arrayIndex != byteCount)
        {
            returnArray[arrayIndex] = curByte;
        }

        return returnArray;
    }

    public static string ToString(byte[] input)
    {
        if (input == null || input.Length == 0)
        {
            throw new ArgumentNullException("input");
        }

        int charCount = (int)Math.Ceiling(input.Length / 5d) * 8;
        char[] returnArray = new char[charCount];

        byte nextChar = 0, bitsRemaining = 5;
        int arrayIndex = 0;

        foreach (byte b in input)
        {
            nextChar = (byte)(nextChar | (b >> (8 - bitsRemaining)));
            returnArray[arrayIndex++] = ValueToChar(nextChar);
            
            if (bitsRemaining < 4)
            {
                nextChar = (byte)((b >> (3 - bitsRemaining)) & 31);
                returnArray[arrayIndex++] = ValueToChar(nextChar);
                bitsRemaining += 5;
            }
            
            bitsRemaining -= 3;
            nextChar = (byte)((b << bitsRemaining) & 31);
        }

        //if we didn't end with a full char
        if (arrayIndex != charCount)
        {
            returnArray[arrayIndex++] = ValueToChar(nextChar);
            while (arrayIndex != charCount) returnArray[arrayIndex++] = '='; //padding
        }

        return new string(returnArray);
    }

    private static int CharToValue(char c)
    {
        int value = (int)c;
        
        //65-90 == uppercase letters
        if (value < 91 && value > 64)
        {
            return value - 65;
        }
        //50-55 == numbers 2-7
        if (value < 56 && value > 49)
        {
            return value - 24;
        }
        //97-122 == lowercase letters
        if (value < 123 && value > 96)
        {
            return value - 97;
        }

        throw new ArgumentException("Character is not a Base32 character.", "c");
    }

    private static char ValueToChar(byte b)
    {
        if (b < 26)
        {
            return (char)(b + 65);
        }

        if (b < 32)
        {
            return (char)(b + 24);
        }

        throw new ArgumentException("Byte is not a value Base32 value.", "b");
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Base32解码 的相关文章

  • SOAP Web 服务:多台服务器,一个接口

    我有一个场景 需要任意数量的服务器来提供相同的 SOAP Web 服务 我想生成一组代理类 并能够为它们提供一个位置 以便在运行时将它们指向不同的服务器 不幸的是 看起来好像wsdl port节点 子节点wsdl service 要求对特定
  • 无法在 CUDA 中找到 1 到 100 数字的简单和?

    我正在研究使用 CUDA 的图像处理算法 在我的算法中 我想使用 CUDA 内核找到图像所有像素的总和 所以我在cuda中制作了内核方法 来测量16位灰度图像的所有像素的总和 但我得到了错误的答案 所以我在cuda中编写了一个简单的程序来查
  • 来自 double 的 static_cast 可以优化分配给 double 吗?

    我偶然发现了一个我认为不必要的功能 并且通常让我感到害怕 float coerceToFloat double x volatile float y static cast
  • 如何在 C# 中以编程方式将行添加到 DataGrid?

    正如标题所述 我正在尝试使用 C 以编程方式将行添加到 DataGrid 但我似乎无法使其工作 这是我到目前为止所拥有的 I have a DataGrid declared as dg in the XAML foreach string
  • Windows Phone 7 - ScrollViewer 值已更改

    我一直在寻找解决方案 但无法找到正确的解决方案 我的网格宽度为 960 并且有ScrollViewer在里面 现在我想知道滚动时滚动的值 水平偏移 我找到的所有解决方案都是针对 wpf silverlight 的 它对我不起作用 Edit
  • 自己绘制的WPF自定义滑块

    这是我关于堆栈溢出的第一个问题 所以不要踢它 我在尝试创建 Mac 风格的滑块控件时遇到问题 我已经发现这个解决方案 http www codeproject com KB miscctrl MAC Slider aspx我已经在我的解决方
  • 从图像创建半透明光标

    是否可以从图像创建光标并使其半透明 我目前正在拍摄自定义图像并覆盖鼠标光标图像 如果我可以将其设为半透明 那就太好了 但不是必需的 销售人员喜欢闪亮的 目前正在做这样的事情 Image cursorImage customImage Get
  • ASP.NET - Crystal Report Viewer 打印按钮在 ASP.NET 中不起作用

    我正在使用 Visual Studio 2008 但我遇到了水晶报告问题 当我单击打印按钮时 它会将我带到弹出窗口 但未找到页面 弹出的网址是 http localhost aspnet client System Web 2 0 5072
  • DateTime.ParseExact - 为什么 yy 变成 2015 而不是 1915

    为什么 NET 假定以下年份是 2015 年 而不是 1915 年 var d DateTime ParseExact 20 11 15 dd MM yy new CultureInfo en GB 我想 它会尝试接近 但其背后是否有合理的
  • 如何从 Powerpoint 2010 导出电影?

    如何使用 MS Office PIA 主互操作程序集 或其他方式以编程方式将嵌入视频从 powerpoint 2010 导出到外部文件 在演示文稿中嵌入视频是 Powerpoint 2010 中的一项新功能 我找不到解决方案 PPTX 文件
  • 从单应性估计 R/T

    我一直在尝试计算 2 个图像中的特征 然后将这些特征传递回CameraParams R没有运气 特征已成功计算并匹配 但是问题是将它们传递回R t 我明白你必须分解Homography为了使这一点成为可能 我已经使用如下方法完成了 http
  • Clang 5.0 上的 vsprintf 和 vsnprintf [-Wformat-nonliteral] 警告

    我有这段代码 static void err doit int errnoflag int level const char fmt va list ap int errno save unsigned long n char buf MA
  • 在一个解决方案中调用不同项目的方法

    1 个解决方案中有 3 个项目 我对第一个项目中的主文件进行的主要操作 但是我需要调用第三个项目中的方法并使用类 例如 第三个项目有 public DataClasses1DataContext base global WindowsFor
  • 禁止显示“资源名称不是有效标识符”

    我有一个包含 5000 多个资源字符串的项目 几乎所有的标识符中都有句点 我们正在切换到自动生成强类型类 当然 由于周期的原因 我们看到了几千条警告 资源名称 blah 不是有效的标识符 我知道不是 生成器将句点更改为下划线 一切都很好 我
  • 让 Windows 尝试读取文件

    我正在对 Windows 文件系统进行某种封装 当用户请求打开文件时 Windows 调用我的驱动程序来提供数据 在正常操作中 驱动程序返回缓存的文件内容 但是 在某些情况下 实际文件没有缓存 我需要从网络下载它 问题是是否有可能让 Win
  • 为什么我可以在另一个函数中定义一个函数?

    请参阅下面的代码 我在另一个函数中定义了一个函数 void test1 void void test2 void printf test2 n printf test1 n int main void test1 return 0 这个用法
  • 在多线程环境中捕获信号

    我有一个大型程序 需要尽可能具有弹性 并且有大量线程 我需要捕获所有信号SIGBUS SIGSEGV 并在必要时重新初始化有问题的线程 或者禁用该线程以继续减少功能 我的第一个想法是做一个setjump 然后设置信号处理程序 可以记录问题
  • 为什么存在系统调用

    我一直在阅读有关系统调用及其在 Linux 中如何工作的内容 我还有更多的阅读要做 但我读过的一件事都没有回答 那就是 为什么我们需要系统调用 我知道系统调用是用户空间程序要求内核执行某些操作的请求 但我的问题基本上是 为什么用户空间程序本
  • C++ 中的析构函数

    我的 AB h 文件中有一个构造函数 class AB private int i public AB i 0 constructor AB i 0 destructor virtual void methodA unsigned int
  • NHibernate:无状态会话错误消息无法获取代理

    我正在使用 nHibernate 无状态会话来获取对象 更新一个属性并将对象保存回数据库 我不断收到错误消息 无状态会话无法获取代理 我在其他地方有类似的代码 所以我不明白为什么这不起作用 有谁知道问题可能是什么 我正在尝试更新Screen

随机推荐

  • 如何使用 mocha 使用“done();”进行异步测试?

    我正在努力写一个asynchronous测试用mocha使用done 称呼 这是我到目前为止的代码 it should have data function db put collection key json payload then f
  • NSURLSession 内存泄漏

    即使在使 NSURLSession 无效后 使用 Instruments 运行配置文件 一些名为 TubeManager HTTPConnectionCache 和 HTTPConnectionCacheDictionary 的类 可能是私
  • 无法通过另一个 Android 应用程序使用(公司简介)url 打开 linkedIn 应用程序?

    我想从我的应用程序打开一个网址 即 http www linkedin com company company name 如果安装了 LinkedIn 应用程序 则需要启动应用程序 否则 通过启动浏览器打开网址 我的代码如下 public
  • 阻止脚本编写者攻击您的网站

    我已经接受了答案 但遗憾的是 我相信我们仍停留在最初的最坏情况 验证码大家都在尝试购买垃圾 简短说明 缓存 网络场使得无法跟踪点击量 并且任何解决方法 发送非缓存网络信标 写入统一表等 都会比机器人更慢地减慢网站速度 思科等公司可能有一些昂
  • 从 R 写入 Excel 时处理 java.lang.OutOfMemoryError

    The xlsx包可用于从 R 读取和写入 Excel 电子表格 不幸的是 即使对于中等大小的电子表格 java lang OutOfMemoryError可能会发生 尤其 jcall RJavaTools Ljava lang Objec
  • 选择前一个日期,mysql

    我有一个包含日期列的表 dte 一个 id 列 id和一个值列 val 每个id包含多个日期 每个日期又包含多个id 这是一个面板数据集 我想检索每个 id 的当前日期 当前值以及最后可用日期 当前日期之前 的值 在 mysql 中执行此操
  • 将所有文本集中在 Apple、Banana 和 Carrot div 中的最佳实践是什么?

    我试图保持相同的样式 摘要描述和摘要标题 我希望包含 Apple Banana 和 Carrot 文本的 div 全部居中 我想让西瓜文本保持左对齐 我将如何实现这个目标 看看我的jsfiddle http jsfiddle net p28
  • Firefox 忽略响应标头内容范围并仅播放发送的示例

    我已经建立了一个音频流mp3文件 每次客户端点击音频时 它都会收到如下内容 但它所做的只是播放 1 分钟的样本 而不是 120 分钟 我在这里做错了什么 不能 100 确定 因为您没有提供代码或示例流来测试 但您对 HTTP 范围请求的处理
  • 聚合方法中两列的求和

    我正在使用 mongodb 聚合查询 我的数据库是这样的 id ObjectId 5a81636f017e441d609283cc userid 123 page A newpage A id ObjectId 5a81636f017e44
  • 在Java中实现“system”命令

    我需要一个 系统 函数调用 与 Python Perl PHP Ruby 等中的函数调用相同 当它在 Rhino JavaScript 引擎上运行时 它将成为名为 Narwhal 的 JavaScript 标准库的一个组件 而 Rhino
  • Htaccess 查询字符串重写

    我有类似的网址 test我想重写为 page php page test 我尝试这样做 但由于某种原因它不起作用 RewriteRule a z0 9 3 20 page php page 1 NC QSA 我究竟做错了什么 查询字符串只能
  • 将天数转换为人类可读的持续时间文本

    给定天数 例如 25 将其转换为持续时间文本 例如 3 周 4 天 如果 F 变体比 C 提供任何改进 那么 C 和 F 解决方案都很棒 编辑 解决方案应该扩展到过去几周以包括几个月和几年 包括世纪等的奖励积分 如果它是可配置的 那就额外奖
  • 使用 BT.709 矩阵的 H.264 编码视频是否包含伽玛调整?

    我已阅读BT 709规格多次 但不清楚的是编码的 H 264 比特流是否应该将任何伽玛曲线应用于编码数据 请注意 BT 709 规范中具体提到的类似伽玛公式 Apple 提供了 OpenGL 或 Metal 着色器的示例 这些着色器从 Co
  • iText 7 HTML 到 PDF 的转换 [重复]

    这个问题在这里已经有答案了 我正在使用 iText 7 生成 PDF 我需要附加具有 HTML 文档的富文本 在 itext 5 中 我使用 Chunk 类来提取数据 但在 itext 7 中我没有看到任何 API 我尝试使用代码 Html
  • 在 Razor ASP.Net MVC3 中的另一个视图中使用 @helpers

    我想写一些简单的 helpers在多个视图中使用 我希望它们位于 Razor cshtml 文件 而不是 c 类 中 以突出显示 HTML 语法 我可以轻松访问 helpers写在同一个视图中 我可以将它们分成Helpers cshtml
  • 如何通过php中的存储过程获取LAST_INSERT_ID

    假设我在 mysql 中有一个存储过程 如下所示 Procedure structure for usp insert user basic info DROP PROCEDURE IF EXISTS usp insert user bas
  • 更改后重新加载用户角色,无需重新登录

    如何刷新登录的用户角色 例如当它被管理员用户更改时 我找到了always authenticate before grantingsecurity 选项 它不包含在 Symfony 4 文档中 并将其设置为true 安全 yaml secu
  • python,pd.read_csv 成熟导入

    我需要导入 pd read csv 重复导入为 我第一次导入 node t1 pd read csv 5mins nodes N122 node t2 pd read csv 10mins nodes N122 node t3 pd rea
  • C++ 中浮点数(双精度)丢失精度

    我正在尝试分配一个大double值到变量并将其打印在控制台上 我提供的数字与显示为输出的数字不同 是否有可能获得double正确分配值并输出而不损失精度 这是 C 代码 include
  • Base32解码

    我有一个 base32 字符串 需要将其转换为字节数组 我在 NET 框架中找不到转换方法 我可以找到适用于 Base64 的方法 但找不到适用于 Base32 的方法 Convert FromBase64String 对于 base32