gpt4 book ai didi

c# - 如何将数字与自定义 2char BaseX 相互转换? (又名 : How to do Azure Table property compression)

转载 作者:行者123 更新时间:2023-11-30 20:11:29 25 4
gpt4 key购买 nike

与十六进制中从 0 到 F 的计数方式类似,我有一个数字和字母数组,我想从中“计数”......当我达到最大值时,我想从头开始“十”列。

我需要它来提高 Azure 表中的存储效率,并保持我的主键很小(这样我就可以在tinyURL 中使用它们)。首先考虑只允许这些字符作为 propertyName,如文档 here 所示。 。在下面的数组中,每个字符根据 Azure 的排序方式进行定位。

  public static string[] AzureChars = new string[]
{
"0","1","2","3","4","5","6","7","8","9","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"
};

我的目标是使用 2 个字符串/ASCII 字符从字符串“00”计数到小写“zz”。

使用 C# 实现这一概念的最佳方法是什么?
-- 数组是正确使用的对象吗?
-- 如何将给定字符(大写“Y”)与其在数组中的位置关联起来?

我只是在尝试这个想法。乍一看,这似乎是一个不错的选择,但我还没有看到有人考虑这样做。你觉得怎么样?

最佳答案

您的问题实际上是关于将数字转换为两位数的 62 基数。以下是将正数转换为任意基数的通用代码片段:

var n = 1234;
var baseNumber = 62;
var numberOfDigits = 2;
var digits = new Int32[numberOfDigits];
for (var i = 0; i < digits.Length; i += 1) {
digits[i] = n%baseNumber;
n /= baseNumber;
}

您必须将数字映射为字符,并且查找表或一个小函数适合执行此操作。

对于具有可变位数的附加功能的具体问题,我会编写以下代码:

var n = 123456; 
var digitCount = 3;
var digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
var number = String.Empty;
for (var i = 0; i < digitCount; ++i) {
number = digits[n%digits.Length] + number;
n /= digits.Length;
}

请注意,此代码会将 0 转换为 000,将 1 转换为 001 等,但我认为其实就是你想要的。

要转换回来,您可以使用以下代码:

var n = 0;
for (var i = 0; i < number.Length; ++i)
n = n*digits.Length + digits.IndexOf(number[i]);

String.IndexOf() 不是进行转换的最有效方法,但在大多数情况下应该没问题。

请注意,如果您的原始数字大于可存储在 62 基数中的最大数字,则转换回来将产生不同的数字。对于 62 进制的 3 位数字,如果原始数字大于或等于 zzz = 62^3 - 1 = 238327,则为 true。

关于c# - 如何将数字与自定义 2char BaseX 相互转换? (又名 : How to do Azure Table property compression),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3740865/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com