-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]=combination of SendBuff[0],SendBuff 1 ,SendBuff[2],SendBuff[3] 字节


我还想知道如何将“88 00 1A 31 31 31”之类的字符串转换为字节并将其存储到 SendBuff[0]

我知道这可能听起来很重复,但我找不到可能对我有用的解决方案。
那里有人请帮帮我,我对此表示赞同。
提前致谢


解释
我正在为智能卡开发并向读卡器发送命令,但需要命令(APDU)具有以下字符串一个
4 字节标题(CLA、INS、P1、P2),例如“88 D2 00 01 02”

该命令通过函数的param3作为字节传递给上述函数。所以我想知道如何将该命令传递给那个 param3。谢谢,希望这个解释有所帮助。

4

2 回答 2

5

做出这些假设:

  1. 您列出的 SCardTransmit 方法不是该方法的声明,而是您实际用来调用它的代码。
  2. 您向我们提供了您用来调用@param1-7 项目列表中的方法的变量类型。

如果第三个参数是 byte[](字节数组),那么您不应该传入 SendBuff[0]。这实际上只是传入一个字节,即位于索引 0 处的字节。您想要发送整个数组。因此,您的调用代码将是:

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

注意:我冒昧地对 SendBuff 到 RecvBuff 做了同样的事情。


您的第二个问题,关于将字符串转换为字节,看起来您正在使用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 回答