2012-04-03 41 views
1

我需要向报价服务器发送请求。每个请求都应该有一个独特的请求编号(无符号整数),以便当附有请求编号的引号返回时,我会知道这些引号属于哪个符号。是否有任何特殊的字符编码这种类型的案件?例如。 “A”是13,“B”是14,所以对于“BA”符号,我的请求编号将是1413.将字符串转换为无符号整形

+0

是报价股票的符号? (我问,因为它定义了符号范围和引用字符串的最大长度)。 – 2012-04-03 21:24:37

+0

是的,他们是股票和期货,所以除了字母之外还会有一个符号“/”。 – Vitaly 2012-04-03 21:27:13

+0

符号的最大长度是多少? – phoog 2012-04-03 21:34:33

回答

2

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

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

这并不提供OP所要求的映射到uint。 – 2012-04-03 21:25:07

+0

哎呀,错过了结果应该是一个uint而不是一个字符串。改变:) :) – porges 2012-04-03 21:29:00

+0

@Vitaly:请注意,这不会为你提到的“/”字符做任何处理。我不确定你想要它有什么价值,但代码目前的方式,它可能不会做很好的事情:) – porges 2012-04-04 05:26:09

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.

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

+0

如果你关心随着时间的推移从数字到符号的映射的一致性,那么呢? – 2012-04-03 21:31:39

+0

@EricJ。主要的一点是你可能不应该在意这一点。如果你真的关心它,那么你需要保留一个符号字典或开发一个像OP所要求的映射函数。 – phoog 2012-04-03 21:36:53

+0

非常好的主意。让我想到。非常感谢你。 – Vitaly 2012-04-04 00:49:13

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”在您的示例中。

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号(数字是“A”到“Z ')并将其转换为10位数,其中“1”位数字最左(与标准数字相反,但无关紧要,因为它内部一致)。如果您想将数字视为一位数字,您只需将input[i]修改为即可。

更新 鉴于你澄清了“/”符号也是允许的,只是“基地”将从26日至27和命令“/”略高于“Z”(任意的,但更容易)。您需要测试输入[i]是否为'/',并为该情况分配结果功率* 27。