我需要向报价服务器发送请求。每个请求都应该有一个独特的请求号(unsigned int),这样当使用该附加请求号返回的引号时,我将知道这些引号属于哪个符号。这类案件是否有任何特殊的字符编码?例如。 “A”为13,“B”为14,因此对于“BA”符号,我的请求号码为1413.
答案 0 :(得分:3)
至于将字符直接映射到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.
如果您需要一些示例代码,请提供有关可能符号值范围的更多信息。
答案 1 :(得分:2)
角色总是大都会A-Z吗?如果是这样,像这样简单的东西会以你所描述的方式转换它:
var symbol = "BA";
var encoded = symbol.Aggregate(0u, (acc, c) => (uint)(acc * 100 + c - 'A' + 13));
答案 2 :(得分:1)
假设A = 13,B = 14,......,Z = 38
您可以编写一个简单的函数来为您执行此转换。类似的东西:
uint output = 0;
foreach (char c in inpStr) {
output = output * 100 + (13 + c - 'A');
}
return output;
在你的例子中inpStr =“BA”。
答案 3 :(得分:1)
如果您的符号始终是大写字母,则可以创建如下的映射:
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的数字(数字为&#39; A&#39;至&#39; Z&#39;)并将其转换为基数为10,其中&#34;那些&#34;最左边的数字(与标准数字相反,但不相关,因为它内部一致)。如果您想将数字视为左侧的数字,则只需将input[i]
修改为input[input.Length - i]
。
<强>更新强> 鉴于您的澄清,&#39; /&#39;符号也是允许的,只需转换&#34; base&#34;从26到27和订单&#34; /&#34;就在上面&#34; Z&#34; (任意,但更容易)。您需要测试输入[i]是否为&#39; /&#39;并为该情况分配结果幂* 27。