Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 更方便。如果您不熟悉javolution,那么很值得一看,因为其中还有很多其他很酷的东西。_Java_C_Compiler Construction_Padding - Fatal编程技术网

Java 更方便。如果您不熟悉javolution,那么很值得一看,因为其中还有很多其他很酷的东西。

Java 更方便。如果您不熟悉javolution,那么很值得一看,因为其中还有很多其他很酷的东西。,java,c,compiler-construction,padding,Java,C,Compiler Construction,Padding,我强烈建议您解决这个问题。XML在这方面可能有一席之地?@starblue XML必须是每个问题的解决方案!!1@starblue谢谢你的回答。编写显式文件转换实际上是不可能的,因为有许多C结构需要使用Java输出(这些结构的格式可能会不时更改)。我觉得我可能必须实现g++在Java中输出时使用的相同形式的填充(我同意你的观点,这是脆弱的)。唯一的优点是平台和编译器不会改变,因此endianness bytesize等不会改变。您也可以尝试通过添加属性来压缩结构。另一个解决方案是编写一个代码生成

我强烈建议您解决这个问题。

XML在这方面可能有一席之地?@starblue XML必须是每个问题的解决方案!!1@starblue谢谢你的回答。编写显式文件转换实际上是不可能的,因为有许多C结构需要使用Java输出(这些结构的格式可能会不时更改)。我觉得我可能必须实现g++在Java中输出时使用的相同形式的填充(我同意你的观点,这是脆弱的)。唯一的优点是平台和编译器不会改变,因此endianness bytesize等不会改变。您也可以尝试通过添加属性来压缩结构。另一个解决方案是编写一个代码生成器来生成正确的I/O函数。@ BBOBE,您是否考虑过XML LOL中的10兆像素HDR图像。一个好的文件格式应该考虑到与大多数目标处理器相同的CiNANES。填充规则也是如此。windows位图中的扫描线始终从4字节边界开始。在整个过程中保持二进制兼容将加快速度。谢谢,不幸的是,我无法更改C结构输出到文件的方式。我能够通过使用java以您提到的形式应用简单的填充来获得相同的输出。你知道C编译器实现填充的方式是否会有很大差异吗?这主要取决于处理器体系结构,所以一旦你将它移植到其他体系结构上,“乐趣”就真正开始了(我们最近就有了)。这并不意味着在同一体系结构上的编译器之间保证是相同的。本文讨论了结构打包以及应用填充的方式和原因:是的,我一直在使用ByteBuffer。我真正遇到的问题是,在写/读的时候,如何填充字节。值得注意的是,java中的char是一个16位的值,而不是C中的8位值。我建议您使用类似于ByteBuffer.putInt(0,C&0xFF)的东西;顺便问一下,你知道数据是大端还是小端。在C语言中,这取决于正在运行的机器的体系结构。
struct {
 char c;
 int i;
} a;
put_char(out, a.c);
put_int(out, a.i);
ByteBuffer bb = ByteBuffer.allocate(8);
bb.order(ByteOrder.LITTLE_ENDIAN);
bb.put(0, someChar);
bb.put(4, someInteger);
byte[] rawBytes = bb.array();
int readInt(InputStream is,int len)
  throws PrematureEndOfDataException
{
  int n=0;
  while (len-->0)
  {
    int i=is.read();
    if (i==-1)
      throw new PrematureEndOfDataException();
    byte b=(byte) i;
    n=(n<<8)+b;
  }
  return n;
}