gpt4 book ai didi

c# - 将二进制读取函数从 C# 转换为 C

转载 作者:行者123 更新时间:2023-11-30 22:39:26 25 4
gpt4 key购买 nike

老实说,我对用 C 语言读取二进制文件感到很困惑。

我的数据格式如下:

  • 内部标题
  • Cell[][] 单元格,8x8 矩阵
  • 每个单元格只是一个短 id 和一个 sbyte z。

但是,显然有些事情搞砸了,没有一个值是准确的。

  int i, j;
Block block;

// read 32 bits
fread( &(block.header), sizeof( int ), 1, mapFile );

// loop through to fill the 8x8 matrix
for( i = 0; i < 8; i++ )
{
for( j = 0; j < 8; j++ )
{
// read 16 bits
fread( &(block.cells[i][j].tileId), sizeof( short ), 1, mapFile );
// read 8 bits
fread( &(block.cells[i][j].z), sizeof( char ), 1, mapFile );

printf( "[%i][%i]: %x %i", i, j, block.cells[i][j].tileId, block.cells[i][j].z );
}
}
printf( "header: %i", block.header );

上面的输出显示了一堆带有 [n][n]: ffffa800 251 的行。

虽然我的 C# 版本工作正常:

            Block block;
block.header = reader.ReadInt32();
block.cells = new Cell[8,8];
for( int i = 0; i < 8; i++ )
{
for ( int j = 0; j < 8; j++ )
{
block.cells[i, j].tileId = reader.ReadInt16();
block.cells[i, j].z = reader.ReadSByte();
}
}

reader.Close();

输出(正确)显示 [n][n]: a8 -5

最佳答案

您应该在 C 中使用更严格定义的类型。例如,int32_t (stdint.h)。您的 short 可能是 32 位的(甚至您的 int 是 16 位的),尽管不太可能。

可能也值得向我们展示 Block struct 是如何定义的。

供引用:

SByte = int8_t

Int16 = int16_t

Int32 = int32_t

关于c# - 将二进制读取函数从 C# 转换为 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5711673/

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