2015-06-17 39 views
1

C#中的數字轉換爲byte[6]的最佳方法是什麼?數字值到字節[6]陣列讀卡器

我正在使用MagTek Card reader並試圖在設備屏幕上顯示所需的數量,它應該是6-byte數組。金額需要使用和授權,EMV Tag 9F02,format n12

功能:

int requestSmartCard(int cardType, int comfirmationTime, int pinEnteringTime, int beepTones, int option, byte [] amount, int transactionType, byte[] cashback, byte [] reserved); 

而對於金額PARAM描述是: - 使用量和授權量,EMV標籤9F02,格式N12。它應該是一個6字節的數組。

編輯:

這是從它們的例子的示例代碼在C#:

  byte []amount = new byte[6]; 
      amount[3] = 1; 
      byte []cashBack = new byte[6]; 

      PrintMsg(String.format("start a emv transaction")); 
      byte reserved[] = new byte[26]; 

      byte cardType = 2; 
      byte confirmWaitTime = 20; 
      byte pinWaitTime = 20; 
      byte tone = 1; 
      byte option = 0; 
      byte transType = 4; 
      retCode = m_MTSCRA.requestSmartCard(cardType, confirmWaitTime, pinWaitTime, tone, option, amount, transType, cashBack, reserved); 

,然後在設備的100.00示$的屏幕量。

編輯: 我改變了問題形式浮動到字節[6]數字到字節[6]。

+2

浮點數是4個字節(32位)長,而不是6個。除非你的意思是你想把數字格式化爲一個6個字符的字符串? –

+0

什麼是「EMV標籤9F02,格式n12」?它不太可能被內置,所以你要麼需要自己進行切換,要麼找到一個能夠做到的庫。 「 –

+0

」要使用和授權的金額,EMV標籤9F02,格式n12。它應該是一個6字節的數組。「這是DynaPro設備MagTek文檔中amount參數的描述。我也不會現在什麼規格... –

回答

1

該方法應該是這樣的:

public static byte[] NumberToByteArray(float f, int decimals) 
{ 
    // A string in the format 0000000000.00 for example 
    string format = new string('0', 12 - decimals) + "." + new string('0', decimals); 

    // We format the number f, removing the decimal separator 
    string str = f.ToString(format, CultureInfo.InvariantCulture).Replace(".", string.Empty); 

    if (str.Length != 12) 
    { 
     throw new ArgumentException("f"); 
    } 

    var bytes = new byte[6]; 

    for (int i = 0; i < 6; i++) 
    { 
     // For each group of two digits, the first one is shifted by 
     // 4 binary places 
     int digit1 = str[i * 2] - '0'; 
     bytes[i] = (byte)(digit1 << 4); 

     // And the second digit is "added" with the logical | (or) 
     int digit2 = str[(i * 2) + 1] - '0'; 
     bytes[i] |= (byte)digit2; 
    } 

    return bytes; 
} 

注(1),它不是最優化的方法。我可以乘以10^decimals,但我不想做無用的乘法運算。 (2)你不應該真的使用floatfloat的精度爲6或7位數(當你運氣好的時候),而這種格式可以存儲12位數字。使用double或甚至更好decimal。您可以用decimal代替float,它會正常工作。

注意(3)您需要使用小數位數。 2歐元或美元,但其他貨幣可能不同。

注意(4)這是從數字轉換爲BCD的問題。它可以不經過一個字符串。太懶了(我不想在float上做乘法運算)

+0

您不需要經過字符串以生成BCD –

+0

@PanagiotisKanavos已添加評論4另一種方法是進行一次或多次乘法運算('10 ^個小數位數')。在'十進制'我會做他們,但'浮'我不做數學操作,除非我真的需要。 – xanatos

+0

它不需要浮動,我只是有一些需要顯示的數量。它不必是浮動的。 –