2011-04-24 20 views
2

我正在寫一個玩具數據庫管理系統,並針對一些對齊和字節順序問題運行。可移植性問題:對齊數據,字節順序問題等

首先,請允許我解釋正在存儲的數據以及存儲的位置。所以首先一些定義。記錄的佈局被分解爲記錄目錄記錄數據

[Field count=N] [Field offset[0]] [...] [Field offset[N-1]] [Data for fields 0 to N] 
  • 的場數和偏移合併被稱爲記錄目錄。

  • 該數據被稱爲記錄數據。

  • 該字段的計數類型爲 uint16_t

  • 字段偏移類型爲 uint16_t

  • 數據字段可以看作是由長度至少爲N字節的(uint8_t *)指向的可變長度字節緩衝區。

  • 該字段數不能超過:4095或0x0FFF(大端)。

的記錄被存儲在一個頁:

  • 頁數是大小:4096個字節。

  • 頁面需要爲每條記錄存儲2個字節的數據。

  • 頁面的最後6個字節存儲正在運行的空閒空間偏移量和槽目錄的數據。元數據與問題無關,所以我不會因任何細節而感到困擾。

我們通過追加到正在運行的可用空間偏移量來存儲頁面上的記錄並追加到頁面上。記錄可以稍後修改和刪除。這會在頁面上留下未使用的空間碎片。這些數據直到壓實時才重複使用。

目前,我們在未使用的空間中存儲0x80的片段字節(因爲空閒空間不能超過0x0FFF,所以第一個字節永遠不會是0x80)。

但是這在壓實時間成爲問題。我們最終掃描一切,直到找到不是0x80的第一個字節。我們認爲這是自由空間的開始。不幸的是,這不是可移植的,只能在大型機器上工作。

但就在這裏重申這個問題,這個問題是區分:0x8080000x800080其中前兩個字節(讀從右到左)是依賴於平臺的字節序兩個有效的場數場。

我想嘗試在偶數字節上對齊記錄。我只是沒有先見之明,看看這是否會成爲這個問題的正確解決方法。

在任何給定的時間,可用空間偏移應該總是位於偶數字節邊界上。這意味着在插入一條記錄之後,您將空閒空間指針前進到下一個偶數邊界。

問題就成爲標記碎片的問題。碎片是在刪除或更改記錄時創建的(增長/縮小一定數量的字節)。我想存儲我所稱的2字節片段標記:0xFFFF。但改變時似乎不可能。

這是我卡住的地方。對於冗長的問題解釋抱歉。我們(我的合作伙伴,這是一個學術任務)多次與數據模糊不清的問題作鬥爭,並以不同的解決方案掩蓋自己。

任何見解都會有幫助。我希望能夠遵循這個問題陳述。

回答

2

我想試試這個:

  1. 對齊記錄至少2字節邊界。
  2. 將空閒空間列表作爲uint16_t列表而不是char, 然後查找length & 0x8000

如果讓機器理解,而不是試圖掃描 他們作爲字符整數這樣,字節順序不應該是一個問題在這裏(至少直到 要在不同的機器上讀取數據庫一個是 寫的)。