将字符串转换为无符号整形
我需要向报价服务器发送请求。每个请求都应该有一个独特的请求编号(无符号整数),以便当附有请求编号的引号返回时,我会知道这些引号属于哪个符号。是否有任何特殊的字符编码这种类型的案件?例如。 “A”是13,“B”是14,所以对于“BA”符号,我的请求编号将是1413.将字符串转换为无符号整形
字符总是大写字母A-Z?如果是这样,简单的东西像这样将它转换成以这样的方式你所描述:
var symbol = "BA";
var encoded = symbol.Aggregate(0u, (acc, c) => (uint)(acc * 100 + c - 'A' + 13));
对于字符直接映射为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 = 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]
修改为即可。
更新 鉴于你澄清了“/”符号也是允许的,只是“基地”将从26日至27和命令“/”略高于“Z”(任意的,但更容易)。您需要测试输入[i]是否为'/',并为该情况分配结果功率* 27。
是报价股票的符号? (我问,因为它定义了符号范围和引用字符串的最大长度)。 – 2012-04-03 21:24:37
是的,他们是股票和期货,所以除了字母之外还会有一个符号“/”。 – Vitaly 2012-04-03 21:27:13
符号的最大长度是多少? – phoog 2012-04-03 21:34:33