将字节数组转换为单个扁平字节值

时间:2012-12-09 00:27:39

标签: c# vb.net visual-studio

我有以下数组


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]中

我知道这可能听起来有点重复,但我找不到可能对我有用的解决方案。
那里有一个请帮帮我,我就堆叠了。
提前谢谢你

<小时/> 解释相关
正在开发智能卡并向读卡器发送命令,但需要命令(APDU)以获得以下字符串a
4字节标题(CLA,INS,P1,P2)例如“88 D2 00 01 02”

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

2 个答案:

答案 0 :(得分:5)

做出这些假设:

  1. 您列出的SCardTransmit方法不是方法的声明,而是您实际用来调用它的代码。
  2. 您提供了用于在@ param1-7项目列表中调用该方法的变量类型。
  3. 如果第三个参数是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获得有关其他类似功能的更多帮助。