gpt4 book ai didi

ada - 读取字节流记录

转载 作者:行者123 更新时间:2023-12-02 18:02:13 25 4
gpt4 key购买 nike

所以我试图将文件读入记录,指定如下:

   type U32        is new Interfaces.Unsigned_32;
type U16 is new Interfaces.Unsigned_16;
type U8 is new Interfaces.Unsigned_8;
type Rotation_t is range 0 .. 3 with Size => 2;
type Tilenum_t is new Interfaces.Unsigned_8;
type Padding_t is range 0 .. 7 with Size => 3;

type Tile is record
Tilenum : Tilenum_t;
XFlipped : Boolean;
YFlipped : Boolean;
Rotation : Rotation_t;
TriFlipped : Boolean;
Padding : Padding_t;
Height : U8;
end record with Size => 24;

for Tile use
record
-- first byte
Tilenum at 0 range 0 .. 7; -- 1111 1111 0000 0000 0000 0000
-- second byte
XFlipped at 0 range 8 .. 8; -- 0000 0000 1000 0000 0000 0000
YFlipped at 0 range 9 .. 9; -- 0000 0000 0100 0000 0000 0000
Rotation at 0 range 10 .. 11; -- 0000 0000 0011 0000 0000 0000
TriFlipped at 0 range 12 .. 12; -- 0000 0000 0000 1000 0000 0000
Padding at 0 range 13 .. 15; -- 0000 0000 0000 0111 0000 0000
-- third byte
Height at 0 range 16 .. 23; -- 0000 0000 0000 0000 1111 1111
end record;
for Tile'Bit_Order use System.Low_Order_First;
for Tile'Scalar_Storage_Order use System.Low_Order_First;

请注意,信息一次传入 3 个字节。在磁盘上,我有:

# hexdump -C
# we are only interested in second line: first one is metadata
00000000 6d 61 70 20 0a 00 00 00 65 00 00 00 50 00 00 00 |map ....e...P...|
00000010 11 00 00 11 00 00 11 00 00 11 00 00 11 00 00 11 |................|

现在,读取此文件 (Tile'Read (...) ) 会产生翻转的结果:

# ada reads:
Tilenum= 17 XFlipped=FALSE YFlipped=FALSE Rotation= 1 TriFlipped=FALSE Padding= 0 Height= 17
Tilenum= 0 XFlipped=FALSE YFlipped=TRUE Rotation= 0 TriFlipped=FALSE Padding= 1 Height= 0
Tilenum= 0 XFlipped=TRUE YFlipped=FALSE Rotation= 0 TriFlipped=TRUE Padding= 0 Height= 0
Tilenum= 17 XFlipped=FALSE YFlipped=FALSE Rotation= 1 TriFlipped=FALSE Padding= 0 Height= 17
# same as above, in numerical form:
0x11 [b:0001 0000] 0x11
0x00 [b:0100 0001] 0x00
0x00 [b:1000 1000] 0x00
0x11 [b:0001 0000] 0x11

虽然我希望结果是:

0x11 0 0
0x11 0 0
0x11 0 0
...

我不确定为什么 0x11 被分成 2 个半字节 ([0001 0001]),它们在两个不同的时间被读取。 (我希望字节可以简单地翻转但作为一个整体保留)。

我推断我正在做一些非常错误的事情。

有什么帮助吗?

最佳答案

我不知道0x110x00 是什么意思。向 Ada 提问时,请使用 Ada 符号和术语。

根据 ARM 13.13.2(9/3) ,“对于复合类型,每个组件的 Write 或 Read 属性按规范顺序调用,这是……记录的位置聚合顺序。”换句话说,做

T : Tile;
...
Tile'Read (F, T);

相当于

declare
F1 : Tilenum_T;
begin
Tilenum_T'Read (F, F1);
T.Tilenum := F1;
end;

declare
F2 : Boolean;
begin
Boolean'Read (F, F2);
T.Xflipped := F2;
end;

等等。这些对 Read 的调用中的每一个都至少读取一个流元素(通常是一个字节),因此 Tile'Read 读取 7 个字节。

可以重新定义 Tile'Read 使其工作。定义更简单也更有可能成功

type Tile_As_Bytes is array (1 .. 3) of U8 with Size => 24;

将 3 个字节读入 Tile_As_Bytes 对象,并使用 Ada.Unchecked_Conversion 将其转换为 Tile

关于ada - 读取字节流记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74107299/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com