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标准函数将整数块复制到四个字节的数组中:

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 回答