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) 你不应该真正使用 float
。 float
的精度为 6 位或 7 位(运气好的话),而该格式可以存储 12 位。使用 double
或更好的 decimal
。您可以将 float
替换为 decimal
,它将正常工作。
注意(3)您需要您要使用的小数位数。 2 欧元或美元,但其他货币可能不同。
注(4)这是一个数字转BCD的问题。它可以在不经过字符串的情况下制作。懒得做(我不想在 float
上做乘法)
一些处理器在不发送 EMV 内核标签 9F02 中的预定金额时可能会从银行返回 "Do No Honor" 错误消息,这是一个一般错误。
通过发送标签 9F02 中的 final/charge 金额,交易获得批准。
这两种情况的结果似乎表明您的处理器正在根据最终金额验证标签 9F02。
这违反了 Visa 规范。
xanatos 的上述解决方案可以解决问题。我也测试了。
在 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) 你不应该真正使用 float
。 float
的精度为 6 位或 7 位(运气好的话),而该格式可以存储 12 位。使用 double
或更好的 decimal
。您可以将 float
替换为 decimal
,它将正常工作。
注意(3)您需要您要使用的小数位数。 2 欧元或美元,但其他货币可能不同。
注(4)这是一个数字转BCD的问题。它可以在不经过字符串的情况下制作。懒得做(我不想在 float
上做乘法)
一些处理器在不发送 EMV 内核标签 9F02 中的预定金额时可能会从银行返回 "Do No Honor" 错误消息,这是一个一般错误。
通过发送标签 9F02 中的 final/charge 金额,交易获得批准。
这两种情况的结果似乎表明您的处理器正在根据最终金额验证标签 9F02。
这违反了 Visa 规范。
xanatos 的上述解决方案可以解决问题。我也测试了。