我有以下数组
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]字节的组合
我也想知道如何将字符串如“88 00 1A 31 31 31”转换为字节并将其存储到SendBuff [0]中
我知道这可能听起来有点重复,但我找不到可能对我有用的解决方案。
那里有一个请帮帮我,我就堆叠了。
提前谢谢你
<小时/> 解释相关
该命令通过函数的param3作为字节传递给上述函数。所以我想知道如何将该命令传递给那个param3.Thanks,希望这个解释有所帮助。
答案 0 :(得分:5)
做出这些假设:
如果第三个参数是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);
}
答案 1 :(得分: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获得有关其他类似功能的更多帮助。