0

パッキングなしで構造を定義する仕様にコードを書いています。たとえば、次のようになります。

struct LASHeader_1p2
{
    char FileSig[4]; //= "LASF";                    // 4
    unsigned __int16 FileSource;                    // 2   6
    unsigned __int16 Reserved_Unused;               // 2   8
    unsigned __int32 Project_ID_Data1;              // 4  12
    unsigned __int16 Project_ID_Data2;              // 2  14
    unsigned __int16 Project_ID_Data3;              // 2  16
    char Project_ID_Data4[8];                       // 8  24
    unsigned char Version_Major;                    // 1  25
    unsigned char Version_Minor;                    // 1  26
    char System_ID[32];                             //32  58
    char Software[32];                              //32  90
    unsigned __int16 FC_Day, FC_Year, Header_Size;  // 2,2,2 96
    unsigned __int32 Offset_to_Data;                // 4 100 0x60
    unsigned __int32 VarLenRecs;                    // 4 104 0x64
    unsigned char Pt_DataFormat;                    // 1 105 0x65
    unsigned __int16 Pt_DataRecLen;                 // 2 107 0x68
    unsigned __int32 PointCount;                    // 4 111 0x6A
    unsigned __int32 Point_by_Return_0;             // 4 115
    unsigned __int32 Point_by_Return_1;             // 4 119
    unsigned __int32 Point_by_Return_2;             // 4 123
    unsigned __int32 Point_by_Return_3;             // 4 127
    unsigned __int32 Point_by_Return_4;             // 4 131
    double Xscale;                                  // 8 139
    double Yscale;                                  // 8 147
    double Zscale;                                  // 8 155
    double Xoffset;                                 // 8 163
    double Yoffset;                                 // 8 171
    double Zoffset;                                 // 8 179
    double MaxX;                                    // 8 187
    double MinX;                                    // 8 195
    double MaxY;                                    // 8 203
    double MinY;                                    // 8 211
    double MaxZ;                                    // 8 219
    double MinZ;                                    // 8 227
};

デフォルト(4バイト)に対して構造体の周りunsigned char Pt_DataFormat;がずれます。これを補うために、/Zp1 コンパイラ オプションを使用して、パディング/アラインメントなしで構造を使用します。遅くなる可能性がありますが、これによりバイトを読み取って構造として解釈できます。

char* buffer = (char*)malloc(sizeof(LASHeader_1p2));
pReadStream.read(buffer ,sizeof(LASHeader_1p2));
LASHeader_1p2* Header = (LASHeader_1p2*)buffer;

値を変更して、バイトとしてファイルに書き込むことができます。他の唯一のオプションは、構造をセクションに分割して、その個々のバイトを整列させて読み取ることですが、これは私には危険に思えます。

ただし、他のライブラリは /Zp1 が好きではありません。内部にパディングされた構造が含まれていると思われますが、パディングを解除すると動作しなくなります。

pragma pack__declspec(align())を見てきましたが、どちらが適切で、どのように使用するかはわかりません。

パディングなしで構造を読み込んでキャストするが、それを必要とする他のライブラリのパディングを維持する方法を誰でも明らかにすることができますか?

4

1 に答える 1