-1

次の配列があります


byte[] SendBuff = new byte[262];
SendBuff[0] = 0x82;
SendBuff[1] = 0xD2;
SendBuff[2] = 0x00;
SendBuff[3] = Convert.ToByte(tAdd.Text.Substring(0, 2),16);
SendBuff[4] = Convert.ToByte(tLen.Text.Substring(0, 2),16);

データを渡す次の関数があります。


SCardTransmit(hCard, ref sIO,ref SendBuff[0],SendBuffLen, ref sIO,ref RecvBuff[0],ref RecvBuffLen);

 @param1 (int)
 @param2 (ModWinsCard.SCARD_IO_REQUEST)
 @param3 (buyte[])
 @param4 (int)
 @param5 (ModWinsCard.SCARD_IO_REQUEST)
 @param6 (buyte[])
 @param7 (int)



SendBuff[0]=SendBuff[0]、SendBuff 1、SendBuff[2]、SendBuff[3]バイトの組み合わせのように、すべての配列データを関数の3番目のパラメーターに単一バイトとして渡す方法を考えています


また、「88 00 1A 31 31 31」のような文字列をバイトに変換して SendBuff[0] に格納する方法も考えています。

これは繰り返しに聞こえるかもしれませんが、私にとって有効な解決策を見つけることができませんでした。
そこにいる誰かが私を助けてください、これにスタックしています。
前もって感謝します


説明
スマート カード用に開発し、カード リーダーにコマンドを送信していますが、次の文字列に4 バイトのヘッダー (CLA、INS、P1、P2) を含めるには、コマンド ( APDU
) が必要です ( 例: "88 D2 00 01 02")。

このコマンドは、関数の param3 を介してバイトとして上記の関数に渡されます。そのコマンドをそのparam3に渡す方法を考えています。ありがとう、この説明が役立つことを願っています。

4

2 に答える 2

5

次の仮定を行います。

  1. リストした SCardTransmit メソッドは、メソッドの宣言ではなく、実際に呼び出すために使用しているコードです。
  2. @param1-7 項目のリストでメソッドを呼び出すために使用している変数の型を指定します。

3 番目のパラメーターが byte[] (バイト配列) の場合、SendBuff[0] を渡すべきではありません。これは実際には、インデックス 0 にある 1 バイトを渡すだけです。配列全体を送信する必要があります。したがって、呼び出しコードは次のようになります。

SCardTransmit(hCard, ref sIO, ref SendBuff, SendBuffLen, ref sIO, ref RecvBuff, ref RecvBuffLen);

: SendBuff から RecvBuff に行ったのと同じことを自由に行いました。


文字列をバイトに変換することについての 2 番目の質問は、Convert.ToByte(tAdd.Text.Substring(0, 2),16);.

あなたが望むのは、それを変換したループです。文字列をスペース文字で分割して、各バイトを反復処理して変換できる部分文字列の配列にすることができます。これを行うコードは次のとおりです。

string stringOfBytes = "88 00 1A 31 31 31";
string[] stringBytes = stringOfBytes.Split(' ');
byte[] outputBytes = new byte[stringBytes.Length];

for (int i = 0; i < stringBytes.Length; i++)
{
    outputBytes[i] = Convert.ToByte(stringBytes[i], 16);
}
于 2012-12-09T00:42:29.193 に答える
3

SCardTransmit の署名が正しくありません。pinvoke.net から、適切な署名とその使用方法に関するサンプル コードを確認できます: http://pinvoke.net/default.aspx/winscard/SCardTransmit.html \

[DllImport("winscard.dll")]
public static extern int SCardTransmit(int hCard, ref SCARD_IO_REQUEST pioSendRequest, ref byte SendBuff, int SendBuffLen, ref SCARD_IO_REQUEST pioRecvRequest,
        ref byte RecvBuff, ref int RecvBuffLen);

次に、リクエストに対して、次のような関数を呼び出します (_hCard が呼び出しからの戻り値への参照であると仮定しますSCardConnect(これは戻り値を破棄することに注意してください):

[StructLayout(LayoutKind.Sequential)]
public struct SCARD_IO_REQUEST
{
   internal uint dwProtocol;
   internal int cbPciLength;
}

SCARD_IO_REQUEST request = new SCARD_IO_REQUEST();
request.dwProtocol = 1; // This is SCARD_PROTOCOL_T1, sub with whatever protocol you're using
request.cbPciLength = System.Runtime.InteropServices.Marshal.SizeOf(typeof(SCARD_IO_REQUEST));

SCardTransmit(_hCard, ref request, ref SendBuff, SendBuff.Length, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);

ネイティブ コールの詳細については、http: //msdn.microsoft.com/en-us/library/windows/desktop/aa379804%28v=vs.85%29.aspxを参照してください。pinvoke.net を使用して詳細を取得できます。他の同様の機能のヘルプ。

于 2012-12-09T00:53:00.480 に答える