C# 将字符串转换为无符号整数

C# 将字符串转换为无符号整数,c#,C#,我需要向报价服务器发送请求。每个请求都应该有一个独特的请求号(unsigned int),这样当带有附加请求号的引号返回时,我就会知道这些引号属于哪个符号。这种情况下有没有特殊的字符编码?例如,“A”是13,“B”是14,因此对于“BA”符号,我的请求编号将是1413。字符是否总是大写字母A-Z?如果是这样的话,像这样简单的东西将以您描述的方式转换它: var symbol = "BA"; var encoded = symbol.Aggregate(0u, (acc, c) => (ui

我需要向报价服务器发送请求。每个请求都应该有一个独特的请求号(unsigned int),这样当带有附加请求号的引号返回时,我就会知道这些引号属于哪个符号。这种情况下有没有特殊的字符编码?例如,“A”是13,“B”是14,因此对于“BA”符号,我的请求编号将是1413。

字符是否总是大写字母A-Z?如果是这样的话,像这样简单的东西将以您描述的方式转换它:

var symbol = "BA";
var encoded = symbol.Aggregate(0u, (acc, c) => (uint)(acc * 100 + c - 'A' + 13));

角色是否总是大写字母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...
}
private Dictionary\u requests=new Dictionary();
私有uint_requestNumber=0;
无效发送请求(字符串符号)
{
uint currentRequestNumber=_requestNumber++;
_请求[currentRequestNumber]=符号;
//…使用currentRequestNumber发送请求
}
无效接管人响应(响应)
{
字符串符号=_请求[response.RequestNumber];
_requests.Remove(response.RequestNumber);
//…对回应做点什么。。。
}
这不是线程安全的;这只是一个示意图来说明这个想法

要回答问题,如果可能的符号值范围足够小,可以采用问题中概述的方法,每个字符映射到一个2位数字,然后将这些数字连接起来。我不知道现有的系统使用这种方法

这种方法浪费了许多无法与任何符号对应的uint值。例如,如果
A
是10,
Z
是35,
\
是36,那么这些范围就被浪费了:0到9,37-1009,1037-1109,等等

另一个选项是将符号解释为基数为27的数字(将
'a'
转换为
'Z'
加上
'\'
作为有效数字),并将其转换为基数为10


如果您想要一些示例代码,请提供有关可能符号值范围的更多信息。

至于将字符直接映射到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...
}
private Dictionary\u requests=new Dictionary();
私有uint_requestNumber=0;
无效发送请求(字符串符号)
{
uint currentRequestNumber=_requestNumber++;
_请求[currentRequestNumber]=符号;
//…使用currentRequestNumber发送请求
}
无效接管人响应(响应)
{
字符串符号=_请求[response.RequestNumber];
_requests.Remove(response.RequestNumber);
//…对回应做点什么。。。
}
这不是线程安全的;这只是一个示意图来说明这个想法

要回答问题,如果可能的符号值范围足够小,可以采用问题中概述的方法,每个字符映射到一个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”在您的示例中。

假设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;
}
uint结果=0;
单位功率=1;
for(int i=0;i
这有效地将您的符号视为基数为26的数字(数字为“a”到“Z”),并将其转换为基数为10的数字,其中“1”的数字最靠左(与标准数字相反,但与此无关,因为它是内部一致的)。如果要将数字视为左侧的一位数,只需将
input[i]
修改为
input[input.Length-i]

更新 如果您澄清了也允许使用“/”符号,只需将“base”从26转换为27,并在“Z”上方排序“/”(任意,但更简单)。Y