Pascal 如何将整数转换为字节数组?

Pascal 如何将整数转换为字节数组?,pascal,Pascal,我有一种ST代码中的动作监听器(类似于Pascal),它返回一个整数。然后我有一个CANopen函数,它允许我只发送字节数组中的数据。如何从这些类型转换 谢谢您的回答。您可以这样做: byte array[4]; int source; array[0] = source & 0xFF000000; array[1] = source & 0x00FF0000; array[2] = source & 0x0000FF00; array[3] = source &

我有一种ST代码中的动作监听器(类似于Pascal),它返回一个整数。然后我有一个CANopen函数,它允许我只发送字节数组中的数据。如何从这些类型转换


谢谢您的回答。

您可以这样做:

byte array[4];
int source;

array[0] = source & 0xFF000000;
array[1] = source & 0x00FF0000;
array[2] = source & 0x0000FF00;
array[3] = source & 0x000000FF;
然后,如果将数组[1]与数组[4]粘合在一起,将得到源整数

编辑:更正了掩码


编辑:正如Thomas在评论->中指出的,您仍然需要将ANDIN的结果值位移到LSB以获得正确的值。

您可以使用
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编写代码了,所以可能会有错误,请随意修改。

您也可以使用变量记录,这是在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;

variant记录的好处在于,一旦设置了它,就可以任意访问任何形式的变量,而无需调用任何转换例程。例如,“myBytesInt.I:=$1234”如果您希望以整数形式访问它,或者“myBytesInt.B[0]:=4”等等,如果您希望以字节数组形式访问它。

以下是使用免费Pascal的解决方案

首先,使用“绝对”:

使用指针:

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.

不确定此C代码是否为Pascal。。。也许
#define BEGIN{
?我很久没有使用Pascal了,但是理解这个代码片段并把它翻译回来并不难;)你说的双F是对的,我已经更正了。你的方法可能更简单(如果你能发一个例子的话),但这是我想到的第一件事。你完全正确!我的辩护是,现在是星期六早上:你必须移动,否则数组[0]、数组[1]和数组[2]将为0。除此之外(事实上它是C,而不是Pascal),对于可移植性,它可能比使用内存要好得多:你的解决方案不依赖于endianness。
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.