一部の BCD バイトをデコードする C++ のスニペットを C# に移植する必要がありますが、C# を初めて使用するので、%、>>、および & 演算子の使用で問題が発生しました。
エンコーディングの説明です。
FASC-N のデータは、Binary Coded Decimal (BCD) と呼ばれるプロセスを使用してエンコードされます。1 文字あたり 5 ビット (4 データ ビットと 1 パリティ ビット) を使用し、16 文字セットになります。40 文字の FASC-N 全体を BCD 数字形式でエンコードすると、200 ビットの情報になります。一度に 1 文字ずつデータを送信するのではなく、送信される各バイトに意味のある 8 ビット (たとえば、文字 1 の 5 ビットと文字 2 の最初の 3 ビット) が含まれるようにデータをパックすることができます。したがって、これらの 200 ビットは 25 バイトの形式で送信できます (200 ビットを 1 バイトあたり 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);
下の 2 つは型エラーだったので、(byte) にキャストしました。
byte b2 = (byte)(nn % 8);
byte b3 = (byte)(byShift >> b2);
そのため、b1 と b3 で if() を試してみましたが、「型 'int' を 'bool' に暗黙的に変換できません」というエラーが再び発生しました。
if(b1 & b3)
C# で if ステートメントをどのように設計するかについてのアイデアはありますか?
興味のある方は、このドキュメントのセクション 5.4、6.0、および 6.1 を読むことで、FASCN をさらに確認できます - http://fips201ep.cio.gov/documents/TIG_SCEPACS_v2.2.pdf