将C++移植到 C# 以解码联邦政府的 FASC-N(联邦机构智能卡号)

本文关键字:FASC-N 机构 智能卡 联邦政府 C++ 解码 | 更新日期: 2023-09-27 18:32:09

我需要将C++片段移植到C#,以解码一些BCD字节,但我对C#很陌生,所以我在使用%>>和&运算符时遇到了问题。

下面是编码说明。

FASC-N 上的数据使用称为二进制编码的过程进行编码 十进制 (BCD)。它每个字符使用 5 位(4 个数据位和 1 个奇偶校验 bit) 并生成 16 个字符集。对完整的 40 个字符进行编码 BCD 数字格式的 FASC-N 产生 200 位信息。而 比一次传输一个字符的数据,数据可以打包 使得每个传输的字节包含 8 个有意义的位(例如 角色一的满分 5 加上角色二的前 3 分)。 因此,这 200 位可以以 25 字节(200 位除以每字节 8 位)。因此,40 个字符的 FASC-N 变为 25 字节 BCD 编码传输。

我有 25 字节的数据,需要解码为 40 字节。

以下是C++:

byte byBCD, byBCDs, byBits, byShift = 0x80, by, nn;
byte FASCN_ReadChars[40] = {0};
// an example raw FASCN
byte FASCN[25] = { 0xd1, 0x38, 0x10, 0xd8, 0x21, 0x0c, 0x2c, 0xd2, 0x54, 0x88, 0x85, 0xa1, 0x68, 0x58, 0x21, 0x08, 0x42, 0x10, 0x84, 0x30, 0x81, 0x38, 0x10, 0xc3, 0xf3 };
nn = 0;
byBCD = 0;
byBits = 0;
byBCDs = 0;
for (nn = 0; nn < 200; nn++)
{
    if (FASCN[(nn / 8)] & (byShift >> (nn % 8)))    /* Databit = 1 */
        byBCD = (byBCD | (0x01 << (nn % 5)));
    byBits++;    /* bit counter (per 5) */
    if (byBits == 5)
    {                               
        /* each 5 bits is a character */
        for (by = 0; by < NO_OF_ABA_CHARS; by++)
        {
            if (byBCD == abyABAMap[by])
            {
                FASCN_ReadChars[byBCDs++] = by;
                break;
            }
        }
        byBits = byBCD = 0;    /* reset bit counter and byBCD */
    }
}

在迁移到 C# 时,下面的行抱怨,"不能隐式地将类型'int'隐蔽为'bool'"

if ((FASCN[(nn / 8)]) & (byShift >> (nn % 8)))

所以我把这条线分解成每个操作,看看哪个在抱怨。

byte b1 = FASCN[(nn / 8)];
byte b2 = (nn % 8);
byte b3 = (byShift >> b2);

底部的两个给出了类型错误,所以我将它们转换为(字节)。

byte b2 = (byte)(nn % 8);
byte b3 = (byte)(byShift >> b2);

所以我尝试了 if() 与 b1 和 b3,但再次得到一个,"不能隐式隐藏类型'int'到'bool'"

if(b1 & b3)

关于如何在 C# 中设计 if 语句的任何想法?

任何有兴趣的人都可以通过阅读本文档的第 5.4、6.0 和 6.1 节来查看 FASCN - http://fips201ep.cio.gov/documents/TIG_SCEPACS_v2.2.pdf

将C++移植到 C# 以解码联邦政府的 FASC-N(联邦机构智能卡号)

C/C++ 会将任何非 0 值视为真,将 0 视为假,但 C# 要求布尔表达式的计算结果为 true 或 false。

尝试以下操作

if (b1 & b2 != 0)