6

指定された通信規格RTCMSC1043.1の場合、データを12ビットデータセグメントのペアとしてバイト間で分割する必要があります。したがって、特定のメッセージについて、メッセージタイプ番号を最初のバイトと2番目のバイトの半分に配置する必要があります。次に、2番目のバイトの半分でID整数を開始し、3番目のバイトに進む必要があります。この種のパターンは、メッセージの最後まで続き、20ビット、5ビット、および他のサイズの整数を削り取り、通常は整数値のMSBの最後を埋める0を本質的にカットします。

明確な定義は見ていませんが、ネットワークバイトオーダーで出力する必要があると思います。そのため、ビットをコピーする前に、メモリ内の整数を逆にする必要があります。私はまだcppを初めて使用し、メモリ内の整数を構成する個々のバイトにどのように到達するのか疑問に思っています。バイトにアクセスできる場合は、ビット単位で使用するか、メッセージ用にビットを2バイトから1バイトに分割することができます。

データを追加する前に、メッセージの作成を開始します。

//build message 1002  gps 00111110 1010
    char buf1002[BUFFERSIZE];
    buf1002[0] = 0x3E; //00111110
    buf1002[1] = 0xA0; //10100000
//ref station id 12 bits of 16
//ex unsigned short m = 1100;
//m would be byte2 00000100 byte1 01001100
//buf1002[1] would be 10100100
//buf1002[2] would be 01001100
//reverse bit order for network after building? 

参照ステーションはunsignedshortからのものであるため、2バイト整数です。では、どうすればそこから1バイトを読み取ることができますか?メモリロケーションポインタから始めますか?もしそうなら、何ですか?

どんな助けでも大歓迎です。

4

4 に答える 4

2

たとえば、整数が00001000 00000000 11000000 00110000のようになっている場合(各シングルバイトを区別するためにスペースを作成しています)、例に含まれているのは次のとおりです。

int     a;
int     single_byte;

a = the_number;

あなたは次のような機能を行うことができます

int     get_byte_in_integer(int byte_number, int integer);

となることによって:

single_byte = get_byte_in_integer(1, a); // That would give you the 11000000 byte

int    get_byte_in_integer(int byte_number, int integer)
{
      return (integer >> (byte_number << 3)) & 0xff);
}

これがバイト部分に役立つことを願っています。

于 2013-02-23T00:08:07.757 に答える
0

たとえば、次のように、バイトとしてパニングすることに頼ることができます。

const unsigned short s(1);
const char* const bytes(reinterpret_cast<const char*>(&s));

const char NaturalOrder[sizeof(s)] = {bytes[0],bytes[1]};
const char EndianFlipped[sizeof(s)] = {bytes[1],bytes[0]};

(ただし、ビルトインの自然なサイズに関する dmckee のコメントも参照し、固定幅型の使用を検討してください)。

于 2013-02-22T23:58:18.600 に答える