2012-02-16 6 views
1

我々は以前にVisual FoxProで開発されたいくつかのアプリケーションを書き換えると、(C#を使用して).NETを使用してそれらを再開発しているVisual FoxPro(VFP)CTOBINとBINTOC機能 - .NETで等価

ここでは、私たちのシナリオです: 当社のアプリケーションが使用スマートカード。私たちは、名前と番号を持つスマートカードからデータを読み込みます。名前は読みやすいテキストでOKですが、数字(この場合は '900')は2バイトの文字表示(131 & 132)に戻り、次のように表示されます。 -

これら2つの特殊文字が表示されます拡張されたAsciiテーブル.. 2バイトが131,132であることがわかるようになりました.1つの標準拡張ASCIIテーブルがないので変更できます(ここではいくつかの記事を読むことができます)

Soスマートカードは、以前にVFPのBINTOC機能を使用して書き込まれていたため、900はカードにf "として書き込まれました。そしてfoxproの中で、これら2つの特殊文字は、CTOBIN関数を使って整数形式に変換することができます。FoxProの別の組み込み関数..

これまでのところ、特殊文字はint(900)に戻っています。これを.NETで文字の表現を実際の整数に戻すことが可能かどうか疑問に思っています。

または、これらの2つのVFP関数のロジックをC#で書き直す方法はありますか?

UPDATE: 私たちは、16ビットバイナリ値に900を変換する必要がある2バイトに900を取得することを実現するいくつかのあいた後で、我々には10進数にその16ビットのバイナリ値を変換する必要があります。

上記のように、私たちは131,132とそれに対応するバイナリ値を10000011(10進値131)と10000100(10進値132)と受け取っています。 これらの2つの値を '1000001110000100'に連結すると10進値33668が得られますが、先行する1を削除して '000001110000100'を10進数に変換すると正しい値900を返します。

しかし...

助けていただければ幸いです。

+1

問題が解決しました。数字900をバイナリに変換し、値を9-16(第2バイト)として2番目のバイトとして残りの値を取り、数字が127より大きい場合は先行する1で更新しました。これは、両方の方向で、> 127(任意の天井値が何であれ32.7未満)の変換を行います。 – Kev

+0

例:バイナリで900 = 1110000100。最後の8桁(10000100)を取って10進数= 132に変換します。最初の2桁(11)とそれに続く0を適用し、1でバイナリ値を開始すると、10000011のようになります。これを10進数に変換すると131になります。 1バイナリ値を10進数に変換して別々に変換し、1000001110000100を与えるためにそれらを結合します。ここで、元の16ビットバイナリ値を得るために位置1の1を0に置き換えます。 2 xビットのチャンクで作業しています – Kev

+0

あなたがあなたの質問に適切に答えたと思うなら、あなたの質問に対する答えとして投稿してください。これにより、あなたはこの質問に答えてマークすることができます。 –

答えて

0

VFPが符号付き16ビット(短い)整数として値を格納しているようです。それは負の数に対して私にとって奇妙な切り替えポイントを持っているようですが、それは128から8ビットの数字を追加し、16ビットの数字に32768を追加します。

文字列から16ビットの数値を変換するのは、16ビットの整数として読み取ってから32768を取り除くのと同じくらい簡単です。これを手動で行う必要がある場合は、最初の数値に256を掛けてから、2番目の数値を加算して格納された値を取得する必要があります。次に、あなたの価値を得るために、この番号から32768控えてください。

例:

131 * 256 = 33536 
33536 + 132 = 33668 
33668 - 32768 = 900 

あなたはあなたのための作業の少なくとも一部を行うためにhttp://msdn.microsoft.com/en-us/library/ms131059.aspxhttp://msdn.microsoft.com/en-us/library/tw38dw27.aspxごとにC#の変換を使用して試みることができるではない場合、手動で上記のコードには余りにも難しいことではありません。

関連する問題