将字符串转换为Unsigned int

时间:2012-04-03 21:20:31

标签: c#

我需要向报价服务器发送请求。每个请求都应该有一个独特的请求号(unsigned int),这样当使用该附加请求号返回的引号时,我将知道这些引号属于哪个符号。这类案件是否有任何特殊的字符编码?例如。 “A”为13,“B”为14,因此对于“BA”符号,我的请求号码为1413.

4 个答案:

答案 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。