将字符串转换为无符号整数
本文关键字:无符号整数 转换 字符串 | 更新日期: 2023-09-27 18:29:58
我需要向报价服务器发送一个请求。每个请求都应该有一个独特的请求号(unsigned int),这样当引号与附加的请求号一起返回时,我就会知道这些引号属于哪个符号。对于这种类型的情况,是否有任何特殊的字符编码?例如,"A"是13,"B"是14,所以对于"BA"符号,我的请求号将是1413。
至于将字符直接映射到uint,你能保证符号不超过6个字符吗?如果不是,那么可能的符号值比可能的uint值多。
在任何情况下,请求编号的目的都不是对有关请求的信息进行编码;相反,您应该保留一个包含请求号(作为键)和关于如何处理响应的信息(作为值)的字典。使用您的方法,如果您对同一符号有多个请求,那么您最终会收到共享同一请求号的不同请求。
例如,如果你想将响应映射到一个符号,你可以这样做:
private Dictionary<uint, string> _requests = new Dictionary<int, string>();
private uint _requestNumber = 0;
void SendRequest(string symbol)
{
uint currentRequestNumber = _requestNumber++;
_requests[currentRequestNumber] = symbol;
//... send request using currentRequestNumber
}
void ReceiveResponse(Response response)
{
string symbol = _requests[response.RequestNumber];
_requests.Remove(response.RequestNumber);
//...do something with the response...
}
这不是线程安全的;这只是一个草图来说明这个想法。
为了回答所问的问题,如果可能的符号值范围足够小,你可以采用你在问题中概述的方法,每个字符映射到一个2位数,你只需将这些数字连接起来。我不知道有哪个现有系统使用这种方法。
这种方法浪费了许多无法与任何符号对应的uint值。例如,如果A
是10,Z
是35,'
是36,则这些范围被浪费:0到9、37-1009、1037-1109等。
另一种选择是将符号解释为以27为基数的数字(其中'A'
到'Z'
加上'''
为有效数字),并将其转换为以10为基数。
如果您想要一些示例代码,请提供有关可能的符号值范围的更多信息。
字符总是大写A-Z吗?如果是这样的话,像这样简单的东西会以你描述的方式转换它:
var symbol = "BA";
var encoded = symbol.Aggregate(0u, (acc, c) => (uint)(acc * 100 + c - 'A' + 13));
假设A=13,B=14。。。,Z=38
您可以编写一个简单的函数来完成此转换。类似于:
uint output = 0;
foreach (char c in inpStr) {
output = output * 100 + (13 + c - 'A');
}
return output;
在您的示例中,inpStr="BA"。
如果你的符号总是大写字母,你可以创建这样的映射:
uint result = 0;
uint power = 1;
for (int i=0; i < input.Length; i++)
{
uint digitValue = power * (input[i] - 'A');
result += digitValue;
power *= 26;
}
这有效地将您的符号视为以26为基数的数字(数字为"a"到"Z"),并将其转换为以10为基数,其中"1"数字最左边(与标准数字相反,但不相关,因为它在内部是一致的)。如果您想将数字视为左侧的一位数字,则只需要将input[i]
修改为input[input.Length - i]
。
更新如果你澄清了"/"符号也是允许的,只需将"基数"从26转换为27,并在"Z"上方排列"/"(任意,但更容易)。您需要测试input[i]是否为'/',并为该情况分配结果幂*27。