2012-12-09 27 views
-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]字节


亦很想知道如何像 “88 00 1A 31 31 31” 的字符串转换为字节,并将其存储到SendBuff [0]

我知道这可能听起来重复bu我没有找到可能适用于我的解决方案。
有一个在那里请帮助我,我在此堆栈。
在此先感谢


解释相关
我为智能卡开发和将命令发送到读卡器,但需要的命令( APDU)具有下列字符串
4字节的头(CLA, INS,P1,P2)例如“88 D2 00 01 02”

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

+5

你不能tu将4个字节转换为1个字节,至少不能以简单的方式返回4个字节。你能否更详细地解释你想要做的事情? –

回答

5

使这些假设:

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

如果第三个参数是byte [](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); 
} 
+0

如果我将第三个参数从参数SendBuff [0]转换为SendBuff,它会产生一个错误,即“参数3:不能从参考字节[]转换为参考字节”。功能和使用由[WinScard API]定义(http://pcsclite.alioth.debian.org/api/winscard_8h.html) –

+0

@HillaryNamanya那么你只需要每字节的SCardTransmit函数多次调用(一次)? –

+0

@StevenDoggart不,我只需要给它一个,然后发送一个完整的APDU命令给读卡器,它将它转发给智能卡。完整的命令如 88 D2 00 01 02 但以字节为单位。感谢 –

3

您对SCardTransmit的签名不正确。从pinvoke。网,你可以看到正确的签名,以及示例代码如何使用它: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获得的其他类似更多帮助功能

+0

thanks.this非常有帮助 –

+0

不客气。你能根据这个数据找出答案吗?你需要进一步的帮助吗? – Tawnos