【问题标题】:How to convert 2 Guids into string of max 50 characters length (2 way conversion)如何将 2 个 Guid 转换为最大 50 个字符长度的字符串(2 路转换)
【发布时间】:2012-03-17 00:43:13
【问题描述】:

有一个有趣的问题 - 我需要将 2 个(随机)生成的 Guid 转换为一个字符串。以下是限制条件:

  1. 字符串最大长度为 50 个字符。
  2. 只能使用数字和小写字母 (0123456789abcdefghijklmnopqrstuvwxyz)
  3. 算法必须是 2 路 - 需要能够将编码的字符串解码为相同的 2 个单独的 guid。

到目前为止,我已经浏览了很多内容来寻找 toBase36 转换 bo,但 Guid 没有运气。

有什么想法吗? (C#)

【问题讨论】:

标签: c# .net guid base36


【解决方案1】:

首先,您很幸运,36^50 大约是 2^258.5,因此您可以将信息存储在 50 字节的 base-36 字符串中。不过,我想知道为什么有人必须为此使用 base-36。

您需要将每个 GUID 视为一个 128 位数字,然后将它们组合成一个 256 位数字,然后将其转换为 base-36 的“数字”。反向转换也是如此。

Guid.ToByteArray 会将 GUID 转换为 16 字节数组。对两个 GUID 执行此操作,您将拥有一个 32 字节(即 256 位)数组。从该数组构造一个BigInt(有一个构造函数),然后将该数字转换为base-36。

要将数字转换为 base-36,请执行以下操作(我假设一切都是正数)

const string digits = "0123456789abcdefghijklmnopqrstuvwxyz";

string ConvertToBase36(BigInt number)
{
    string result = "";
    while(number > 0)
    {
        char digit = string[number % 36];
        result += digit;
        number /= 36;
    }
}

【讨论】:

  • 谢谢!如何将 BigInt 转换为 base-36?这就是我正在努力解决的问题......
  • 我不明白这是如何工作的。结果为空。因此,您每次都在循环中对空值运行模数。这意味着您的结果将为空。
  • 您发现了一个错字。它应该说数字 % 36。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多