Интересна тема. Я за создание такого сборника, если его нет конечно уже в составе какого нибудь пакета. Мне понадобилось туда сюда конвертировать REAL в буфер и из буфера и получилось что то вроде кода ниже (для паковки объектов в поток TCP использую WriteReal и ReadReal). Напоминает Stores. Может изобрел велосипед и в BB есть стандартные функции для таких задач?
Код:
MODULE TcpBytes;
IMPORT
SYSTEM, Kernel;
TYPE
B8 = ARRAY 8 OF BYTE;
PROCEDURE WriteReal* (r: REAL; VAR b: ARRAY OF BYTE; VAR pos: INTEGER);
VAR i: INTEGER; le: B8;
BEGIN
IF Kernel.littleEndian THEN
le := SYSTEM.VAL(B8, r);
FOR i := 0 TO 7 DO b[pos + i] := le[i] END
ELSE
le := SYSTEM.VAL(B8, r);
FOR i := 0 TO 7 DO b[pos + i] := le[7 - i] END
END; INC(pos, 8)
END WriteReal;
PROCEDURE WriteRealS* (r: REAL; VAR b: ARRAY OF BYTE; pos: INTEGER);
VAR s: INTEGER;
BEGIN
s := pos; WriteReal(r, b, s)
END WriteRealS;
PROCEDURE RealToBytes* (r: REAL): POINTER TO ARRAY OF BYTE;
VAR res: POINTER TO ARRAY OF BYTE; s: INTEGER;
BEGIN
NEW(res, 8); s := 0;
WriteReal(r, res, s);
RETURN res
END RealToBytes;
PROCEDURE ReadReal* (IN b: ARRAY OF BYTE; VAR pos: INTEGER): REAL;
VAR i: INTEGER; le: B8;
BEGIN
IF Kernel.littleEndian THEN
FOR i := 0 TO 7 DO le[i] := b[pos + i] END
ELSE
FOR i := 0 TO 7 DO le[7 - i] := b[pos + i] END
END; INC(pos, 8);
RETURN SYSTEM.VAL(REAL, le)
END ReadReal;
PROCEDURE ReadRealS* (IN b: ARRAY OF BYTE; pos: INTEGER): REAL;
VAR s: INTEGER;
BEGIN
s := pos;
RETURN ReadReal(b, s)
END ReadRealS;
PROCEDURE BytesToReal* (b: ARRAY 8 OF BYTE): REAL;
VAR s: INTEGER;
BEGIN
s := 0;
RETURN ReadReal(b, s);
END BytesToReal;
END TcpBytes.