64ビットシステムにnバイトを追加する方法
-
20-09-2019 - |
質問
私は64ビットX_86 64ビットOSXシステムで作業しています。
Legacyデータベースのファイルを読んでいます。メモリブロックにロードされ、構造に読み取られたオフセットを使用します。 32ビットモードで書かれています。
したがって、64ビットモードで適切に読み取るために、構造のベースアドレスにnバイトを追加したいと思います。
ポインター切開以来
64ビットモードであるため、すべてのポインターが長いバイトであるため、増分は私がそれをするのに役立ちません。
よろしく、ダナ。
ここにいくつかのコードを投稿しました。私はそれが正しいと思います。
struct CamNodeTag {
CamNodeTag *nextCam; // next cam
SInt32 numMake;
char *menuMake;
};
long pBaseAddr; // this is long so we an offset bytes from it.
//Get the size of of the structure in 32 bit environment.//in 64 bit envi it is 20 bytes.
int CamNodeTagSizeIn32BitMode = 12;
//Do it in a while loop..
int i=0;
CamNodeTag * pNode = (CamNodeTag *)(pBaseAddr + i*CamNodeTagSizeIn32BitMode);
while(pNode !=NULL)
{
//Do the cam stuff here..
// to get the next node, we add the base addr to the offset
//This will give next cam
i++;
pNode = (CamNodeTag *)(pBaseAddr + i*CamNodeTagSizeIn32BitMode);
}
解決
私 代わりにお勧めします Diskからファイルを読み取ること read_uint32_whatever_endian(FILE*)
そしてそのような、そしてこれらをあなたの新しい64bitインメモリに保存します struct
s。
これにより、コンパイラが構造のメモリレイアウトについて作成する選択肢から新しいコードを隔離します。
最新のマシンでは、このような解析のパフォーマンスコストは最小限であるため、ほとんど測定できないと確信しています。
ある間、 わずか コーナーケース場所 nmap
コンパイラのメモリ内表現と同じバイナリ構造を保存するEDの大規模なデータベースファイルはプラスです。このケースは実際にはあまり価値がありません。
メモリ内のディスク上の異なるシリアル化の利点は、多くの実用的なプラスを提供します。
- それはポータブルです - あなたは異なるワードサイズと異なるエンディアンで問題なく異なるプロセッサであなたのコードを実行することができます
- 構造をいつでも拡張できます - メソッドなど、仮想C ++メソッド、およびオブジェクト指向設計のその他の利点を含むオブジェクトにインメモリ構造を作成できます。ポインターやその他のフィールドなど、シリアル化されないメンバーを追加することもできます。また、新しいデータベースファイルバージョンを簡単にサポートできます。
他のヒント
ネイティブサイズ以外の何かでポインターを前進させるには、Char *にキャストする必要があります。
64ビットプロセッサを使用して「ポインター」として32ビット値を使用するファイルから読み取るには、ポインターであったフィールドがまだ32ビットのサイズであるように、構造を再定義する必要があります。
typedef int Off32; // our "pointers" need to be 32 bit ints rather than pointers.
struct CamNodeTag {
Off32 nextCam; // next cam
SInt32 numMake;
Off32 menuMake;
};
char * pBaseAddr; // this is char * so we an offset bytes from it.
// set this to point to the first node.
CamNodeTag * pNode = (CamNodeTag *)(pBaseAddr + first_node_offset);
// to get the next node, we add the base addr to the offset
// in the structure.
pNode = (CamNodeTag *)(pBaseAddr + pNode->nextCam);
// assuming that the menuMake pointer is also an offset from the base
// use this code to get the actual pointer.
//
char * pMenu = (pBaseAddr + pNode->menuMake);