0

ソフトウェアの一部では、カードがカードリーダーによって読み取られ、ユーザーに割り当てられます。また、このソフトウェアの他の部分では、同じカードリーダーによる端末で、ユーザーカードが読み取られ、カードのシリアル番号などによってデータベースからデータが取得されます。

このソフトウェアの新しい部分には、新しいカードリーダーを備えた新しい端末があります。カードはこのカードリーダーから読み取られ、データベースなどからデータを取得します。

問題は、この 2 つのカード リーダーで読み取られる同じカードの種類が異なることです。最初のデバイス リターン カード ID は、次のように 16 進文字列として返されます。

2E 6F 27 3F

この 16 進数の文字列は 10 進数に変換され、データベースに格納されます。たとえば、上記の 16 進数文字列は次の整数に変換されます。

779036479

次に、2 番目のカード リーダーがこの同じカードを読み取ると、カード ID は、そのカードの次のようなバイトの配列になります。

byte0: 49
byte1: 48
byte2: 53
byte3: 57
byte4: 53
byte5: 52
byte6: 56
byte7: 57
byte8: 55
byte9: 52

同じカードのこの 2 つのシリアル番号を相互に調整するにはどうすればよいですか? 言い換えれば、このバイト配列を対応する 16 進コードに変換して、この 16 進コードが最初のデバイスが返すカードのシリアル番号になるようにしますか?

カードはミファーレ。

4

2 に答える 2

3

答えは、2 番目のリーダーが ASCII エンコードの 10 進数を返しているということです。あなたの番号は1059548974です。16 進数にエンコードされたこの数値は、3F276F2Eビッグ エンディアン エンコードを使用している場合です。リトル エンディアン エンコーディングを使用している場合2E6F273Fは、使い慣れたものを取得できます。

そう:

  1. 返されたバイト配列を ASCII にデコードし、文字列を取得します"1059548974"
  2. を使用してその文字列を整数に変換しますConvert.ToUInt32(str);
  3. 整数のバイトを逆にする

おそらく、バイトを逆にする最良の方法は、次のコードです。

public static UInt32 ReverseBytes(UInt32 value)
{
  return (value & 0x000000FFU) << 24 | (value & 0x0000FF00U) << 8 |
         (value & 0x00FF0000U) >> 8 | (value & 0xFF000000U) >> 24;
}
于 2013-06-19T21:01:12.527 に答える