3

ST コード (Pascal に似たもの) に一種のアクション リスナーがあり、整数を返します。次に、CANopen関数を使用して、バイト配列でのみデータを送信できるようにします。これらの型からどのように変換できますか?

ご回答ありがとうございます。

4

4 に答える 4

3

Free Pascal で動作するソリューションを次に示します。

まず、「絶対」で:

var x: longint;
    a: array[1..4] of byte absolute x;

begin
x := 12345678;
writeln(a[1], ' ', a[2], ' ', a[3], ' ', a[4])
end.

ポインターを使用する場合:

type tarray = array[1..4] of byte;
     parray = ^tarray;

var x: longint;
    p: parray;

begin
x := 12345678;
p := parray(@x);
writeln(p^[1], ' ', p^[2], ' ', p^[3], ' ', p^[4])
end.

二項演算子の場合:

var x: longint;

begin
x := 12345678;
writeln(x and $ff, ' ', (x shr 8) and $ff, ' ',
        (x shr 16) and $ff, ' ', (x shr 24) and $ff)
end.

記録あり:

type rec = record
              case kind: boolean of
              true: (int: longint);
              false: (arr: array[1..4] of byte)
           end;

var x: rec;

begin
x.int := 12345678;
writeln(x.arr[1], ' ', x.arr[2], ' ', x.arr[3], ' ', x.arr[4])
end.
于 2013-02-23T16:49:57.853 に答える
3

標準関数を使用してMove、整数を 4 バイトの配列にブロック コピーできます。

var
    MyInteger: Integer;
    MyArray: array [0..3] of Byte;
begin
    // Move the integer into the array
    Move(MyInteger, MyArray, 4);

    // This may be subject to endianness, use SwapEndian (and related) as needed

    // To get the integer back from the array
    Move(MyArray, MyInteger, 4);
end;

PS: ここ数か月 Pascal でコーディングしていないので、間違いがあるかもしれません。お気軽に修正してください。

于 2013-02-23T09:30:24.783 に答える
2

バリアントレコードを使用することもできます。これは、ポインタを使用せずにPascalで変数を意図的にエイリアス化する従来の方法です。

type Tselect = (selectBytes, selectInt);
type bytesInt = record
                 case Tselect of
                   selectBytes: (B : array[0..3] of byte);
                   selectInt:   (I : word);
                 end; {record}

var myBytesInt : bytesInt;

バリアントレコードの良いところは、一度設定すると、変換ルーチンを呼び出さなくても、どちらの形式でも変数に自由にアクセスできることです。たとえば、整数としてアクセスする場合は「 myBytesInt.I:= $ 1234 」 、バイト配列としてアクセスする場合は「 myBytesInt.B [0]:=4 」などです。

于 2013-02-23T14:46:40.710 に答える
-1

次のようなことができます:

byte array[4];
int source;

array[0] = source & 0xFF000000;
array[1] = source & 0x00FF0000;
array[2] = source & 0x0000FF00;
array[3] = source & 0x000000FF;

次に、配列[1]を配列[4]に接着すると、ソース整数が得られます。

編集:マスクを修正しました。

編集:トーマスがコメントで指摘したように->正しい値を取得するには、ANDingの結果の値をLSBにビットシフトする必要があります。

于 2013-02-23T09:07:12.313 に答える