私の機能の要件は次のとおりです。
次の文字列を取ります。
6900460420006149231=13050010300100000
次のバイト配列に変換します。
{ 0x37, 0x06, 0x90, 0x04, 0x60, 0x42, 0x00, 0x06, 0x14, 0x92, 0x31, 0xD1, 0x30, 0x50, 0x01, 0x03, 0x00, 0x10, 0x00, 0x00 }
最初のバイト 0x37 は、バイナリの文字列の元の長さです。次の 10 バイトは、bcd 形式でエンコードされた文字列「6900460420006149231」です。ここがややこしいところです。ここで、2 つのフィールド間の区切り記号 (=) を表す 16 進数の 'D' が必要です。バイト配列の 12 インデックスの上位ニブルに 16 進数が表示されます。バイト配列の残りは、bcd 形式でエンコードされた 2 番目のフィールド「13050010300100000」です。元の長さが奇数の場合は、未使用データの最初の半バイトを埋めるために先行ゼロを入れます。
私は誰からも完全な実装を期待していないので、これを分解して、問題が発生している場所に対処しましょう。私が持っているとしましょう:
byte[] field1Bytes = { 0x06, 0x90, 0x04, 0x60, 0x42, 0x00, 0x06, 0x14, 0x92, 0x31 }
byte[] field2Bytes = { 0x01, 0x30, 0x50, 0x01, 0x03, 0x00, 0x10, 0x00, 0x00 }
byte separator = 13; // D 0x0D
単純に Array.Copy を使用すると、次のようになります。
{ 0x06, 0x90, 0x04, 0x60, 0x42, 0x00, 0x06, 0x14, 0x92, 0x31, 0x0D, 0x01, 0x30, 0x50, 0x01, 0x03, 0x00, 0x10, 0x00, 0x00 }
上記のバイト配列は、私が必要としているものではありません.次の関数を実装して、達成しようとしているものに近づける方法についてのアイデア:
byte[] ShiftLeftAndCombine(byte[] b1, byte[] b2)
どこ
ShiftLeftAndCombine({0x0d}, {0x01, 0x30})
戻るだろう
{0xd1, 0x30}
- ちなみに、私が書いている実際の関数に対処するには、偶数/奇数のフィールド長を処理する必要があることに気付きましたが、それについて心配させてください =]