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