2012-04-03 25 views
1

引用サーバーに要求を送信する必要があります。それぞれのリクエストには固有のリクエスト番号(unsigned int)が必要です。そのため、添付されたリクエスト番号でクォートが返されたときに、それらのクォートがどのシンボルに属するかを知ることができます。このタイプのケースにエンコードする特別な文字はありますか?例えば。 "A"は13、 "B"は14です。したがって、 "BA"シンボルのために私のリクエスト番号は1413になります。文字列を符号なし整数に変換する

+0

引用符はありますか? (これは、シンボルの範囲と引用文字列の最大長を定義しているためです)。 –

+0

はい、在庫と先物ですので、文字とは別にもう1つの記号 "/"があります。 – Vitaly

+0

シンボルの最大長はどれくらいですか? – phoog

答えて

2

文字は常に大文字ですか?もしそうなら、このような単純な何かがあなたが説明してきた方法でそれを変換します:uintに直接文字をマッピングするよう

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

これは、OPによって要求されたように、uintへのマッピングを提供しません。 –

+0

おっと、結果はuintであり、文字列ではないはずです。それを変更しました:) – porges

+0

@Vitaly:これはあなたが言及した "/"文字の処理を行いません。私はあなたが望む価値があるかどうかは分かりませんが、現時点でのコードは良いことはないでしょう:) – porges

3

、あなたはシンボルが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別のオプションは、シンボルを解釈するであろう

等、1037から1109まで、37から1009、9 ( 'Z'から 'A'プラス '\'として有効桁)ベース27数として、あなたはいくつかのサンプルコードを希望の場合は10

をベースに、それを変換するには、可能なシンボル値の範囲についてのいくつかのより多くの情報を記入してください。

+0

そして、時間の経過とともに数字から記号へのマッピングの一貫性を気にしているのであれば、それは何ですか? –

+0

@ EricJ。主なポイントは、おそらくそれに気を付けるべきではないということです。あなたがそれについて気にしているなら、OPのように、シンボルの辞書を保持したり、マッピング機能を開発したりする必要があります。 – phoog

+0

非常に良いアイデア。私は考えさせました。どうもありがとうございました。 – Vitaly

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数Z」を通して(数字である「A」であると考えて')、それを基数10に変換します。「1」の数字は左に一番遠い(標準数字の逆ですが、内部的に一貫しているため無関係です)。数字を1桁左に扱う場合は、input[i]をに変更するだけで済みます。

更新 は(任意ですが、簡単に)単に「/」だけ「Z」の上に26から27と順に、「ベース」を変換し、「/」記号も許可されていることを、あなたの明確化を考えます。 input [i]が '/'であるかどうかをテストし、その結果のパワー* 27を割り当てる必要があります。

関連する問題