number值到byte[6]数组卡reader

number value to byte[6] array card reader

C# 中将数字转换为 byte[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);

金额参数的描述是: - amount 要使用和授权的数量,EMV Tag 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 $。

编辑: 我将问题形式 float to byte[6] 更改为 number to byte[6].

方法应该是这样的:

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。您可以将 float 替换为 decimal,它将正常工作。

注意(3)您需要您要使用的小数位数。 2 欧元或美元,但其他货币可能不同。

注(4)这是一个数字转BCD的问题。它可以在不经过字符串的情况下制作。懒得做(我不想在 float 上做乘法)

一些处理器在不发送 EMV 内核标签 9F02 中的预定金额时可能会从银行返回 "Do No Honor" 错误消息,这是一个一般错误。

通过发送标签 9F02 中的 final/charge 金额,交易获得批准。

这两种情况的结果似乎表明您的处理器正在根据最终金额验证标签 9F02。

这违反了 Visa 规范。

https://www.visa.com/chip/merchants/grow-your-business/payment-technologies/credit-card-chip/docs/quick-chip-emv-specification.pdf

xanatos 的上述解决方案可以解决问题。我也测试了。