2012-12-09 35 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