星期日, 五月 24, 2009

用 Objective-C 從二進位檔案(binary file)中讀入數值的 byte order 問題

要從二進位檔案中讀入數值,其中一個會遇到的問題就是 Little-endian 和 Big-endian,這和 CPU 的種類有關。Intel 系列的 x86 CPU 使用的是 Little-endian,而 PowerPC、ARM 等的 CPU 則是採用 Big-endian。endian 不同的問題,在以前 PPC 的時代算是相當重要,後來改用 Intel CPU 之後重要性就下降了許多,不過現在因為 iPhone 採用的 ARM 又是 Big-endian,所以這問題的重要性又大幅提升了,尤其許多新手設計師,之前可能根本沒碰過非 Intel 的平台,根本沒考慮過這問題,於是寫出來的程式就會讀到一堆詭異的數字。

首先我們要先界定 endian 的問題會影響到哪些資料型別。所謂 endian 不同,是因為高低位元在記憶體中表示的方式不同而造成的,Little-endian 將高位元放在記憶體位址較大的地方,Big-endian 則反之。舉例來說,0x00112233 這個 16 進位的數字,在 Little-endian 的機器上,在記憶體中呈現的是 33 22 11 00,而在 Big-endian 的機器上則呈現 00 11 22 33。因此,假如把在 Little-endian 機器上寫入的二進位檔拿給 Big-endian 的機器讀取,讀出來的數字就會出錯。

從這邊我們可以發現,要發生 endian 的問題,首先資料型別必須用超過 2 個 byte 來儲存才有可能,因此只用一個 byte 儲存的型別,例如 char,就沒有 endian 的問題。

至於 int、long 之類的整數型別,可以用 CFSwap[type][Big/Littile/Host]To[Big/Littile/Host] 系列函式來轉換。其中的 type 可能是 Int16、Int32 等等。使用方法如下:
int littleEndian = 1234;
int hostEndian = CFSwapInt16LittleToHost(littleEndian);
那麼 hostEndian 的變數值就是採用目前機器上的 endian 順序的 int。

不過浮點數就沒這麼輕鬆了。我們在前面的例子中還是用 int 來存放 littleEndian,因為就算 byte order 不對了,但它仍然是個 valid 的 integer,不過浮點數的每個 bit 有它不同的意義,因此一旦 byte order 解譯錯誤,它就可能變成 invalid float,導致程式直接當掉。

為了解決這個問題,Objective-C 中用了一個與 byte order 無關的資料結構來儲存這個資料,定義如下:
struct CFSwappedFloat32 {
uint32_t v;
};
typedef struct CFSwappedFloat32 CFSwappedFloat32;
可以看到,這個結構中就只有一個 data,uint32_t,Objective-C 就是用它來儲存這個 float 的資料(當然,此時系統並不會把它當成一個 float)。接下來的處理方式就是,將這個 uint32_t 裡面的 byte 頭尾互換位置,然後將這 32 個 bit(4 個 byte)轉化成 float。而這就是 CFConvertFloat32SwappedToHost 這個函式在作的事。整個的用法可以用以下的例子表示:
CFSwappedFloat32 littleFloat;
long buffer;
float hostFloat;

fread(&buffer, sizeof(long), 1, fp);
littleFloat.v = buffer;
hostFloat = CFConvertFloat32SwappedToHost(littleFloat);
當然,其中的 fread 可以用 memcpy、NSData 的 byte method 等等取代,只要把握住一個原則:「 CFSwappedFloat32 的內部是用 uint32_t 來儲存這個待轉換的 float」即可。

標籤: , , ,

星期一, 一月 05, 2009

iPhone Simulator 在 PPC 平台上執行 OpenGL ES 的顏色怪異問題


最近在寫 iPhone 上的 OpenGL 程式,不過雖然 Xcode 中就有提供 OpenGL 的樣版,但是因為對 OpenGL 不熟,看得不是很懂。

雖然後來自己改了裡面的程式碼,也畫出了東西,但是在 Simulator 中執行時整個就是怪,首先是顏色全部跑掉了,一般設定顏色的順序是 RGBA,但是在 Simulator 中顏色的順序居然變成了 GRAB,所以畫出來的顏色整個就是怪。

這感覺就很像是 byte-order 採用 little-endien 和 big-endien 所造成的問題,後來 Google 了一下,果然也有人遇到一模一樣的問題,據他所說,其他的 CocoaTouch 部份都可以正常運作,就只有 OpenGL 的部份會出錯。

我想這個出錯的原因應該是因為 OpenGL ES 裡面不能用 glBegin()/glEnd(),然後個別指定 vertex 資訊的這種用法,必須把 vertex 和 normal、color 等資料存成陣列,用 glDrawArray()/glDrawElement() 的方式一次丟給顯示晶片處理,而應該是 simulator 把陣列丟給顯示晶片時造成的 byte-order 問題。目前確定顏色會出問題,不知道 normal 和 vertex 陣列會不會也跟著出問題...

而 iPhone SDK on PPC 是不被官方所支援的平台,我看這個 bug 的修復應該是遙遙無期了...

標籤: ,

星期二, 八月 19, 2008

在 PowerPC 的 Mac 上安裝 iPhone SDK [續]

如果有朋友照著前一篇文章在 PPC 的機器上安裝 iPhone SDK 的話,應該會跟我遇到一樣的問題,那就是無法編譯 Project...

其實嚴格講起來也不是不能編譯,只是 Active SDK 沒辦法選用 Simulator,會得到 "No architectures to compile for (ARCHS=ppc, VALID_ARCHS=i386)." 的錯誤訊息。不過選用 Device 則可以正常編譯。不過這樣開發過程就會變得很麻煩,而且 Simulator 就完全沒用了。而且既然 Simulator 是 Universal 的程式,這應該是單純修改設定就可以解決的問題才是。

果然,經過簡單的 Google 之後,在 http://czhangblog.blogspot.com/2008/07/iphone-sdk.html 找到了解法。

主要就是把 iPhone Simulator 的一個設定檔修改一下即可。檔案位置在 /Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Specifications/,找到裡面的 iPhone Simulator Architectures.xcspec 這個檔案。

先備份之後,把裡面
RealArchitectures = ( i386 );
這行,改成
RealArchitectures = ( i386, ppc );
然後在
// Intel
{ Type = Architecture;
...

前面加入
// G3
{ Type = Architecture;
Identifier = ppc;
Name = "Minimal (32-bit PowerPC only)";
Description = "32-bit PowerPC";
PerArchBuildSettingName = "PowerPC";
ByteOrder= big;
ListInEnum = No;
SortNumber = 201;
},

// G4
{ Type = Architecture;
Identifier = ppc7400;
Name = "PowerPC G4";
Description = "32-bit PowerPC for G4 processor";
ByteOrder= big;
ListInEnum = NO;
SortNumber = 202;
},

// G5 32-bit
{ Type = Architecture;
Identifier = ppc970;
Name = "PowerPC G5 32-bit";
Description = "32-bit PowerPC for G5 processor";
ByteOrder= big;
ListInEnum = NO;
SortNumber = 203;
},
或者也可以直接下載我改好的設定檔。

改好之後重新啟動 Xcode,你應該就可以完整的在 PPC 機種上開發 iPhone 的程式了。

標籤: ,

星期五, 八月 15, 2008

在 PowerPC 的 Mac 上安裝 iPhone SDK

如果你像我一樣還在用 PPC 的 Mac,卻又想開發 iPhone 的軟體的話,你會發現一個討人厭的問題,就是 iPhone SDK 不能裝在 PPC 的機器上。
iPhone SDK skip但是有人發現,iPhone SDK 裡面的所有程式都是 universal 的程式,也就是說,所謂的 "只支援 Intel-based Mac" 云云,只是 Apple 要逼退 PPC 機器的手段。

因此想要在 PPC 機器上開發 iPhone 軟體的朋友,請打開 iPhone SDK DMG 檔,找到 Packages 資料夾。
從 Packages 資料夾下,找出所有 iPhone* 開頭的 pkg 檔,一個一個手動安裝。不過請記得,安裝的時候請自己指定位置到 Xcode 3.1 安裝目錄(預設是 /Developer)。全部裝好之後,你就可以開啟 Xcode,在 New Project... 選項中找到 iPhone OS 的樣版,開始開發 iPhone 程式了。

iPhone Simulator 的執行也是沒有問題的。
Good luck!

標籤: ,

星期一, 三月 03, 2008

iPhone/iPod Touch 更新/降級系統相關的問題與解法

最近幫人破解 iPod Touch,結果要從 1.1.3 降級回 1.1.1 的時候遇到了許多問題,iTunes 一直跳出視窗說回復失敗,發生了未知的錯誤等等,google 了一下找到了這些錯誤代碼的意義和解法,整理如下:
  • 未知的錯誤 (1):這代表 iPod Touch 沒有進入 DFU 模式,必須要進入 DFU 模式才能降級。而要進入 DFU 模式有兩個方式:
      1. 連上 iPhone 跟電腦,打開 iTunes, 確認 iPhone 是開啟的(不是 power off).
      2. 同時按下 Sleep + Home,等到畫面變黑時,但還不是全黑時,放掉 Sleep ,但持續按 Home 鍵(約 10~20秒),直到 iTunes 發現一台 iPhone 在 recovery 狀態.
      3. 已進入 DFU,接下來就照著破解步驟做。
      注意,Sleep 鍵必須要在出現白蘋果前放掉,而在等畫面變黑,又不是全黑的時間點不太好抓,多試幾次應該就會了,大約是同時按下 Sleep+Home 後的6秒。成功的 DFU ,iPhone是沒任何畫面的,切記。
      以上引用自iphone4.tw
    • 另一個方法是利用 ZiPhone,比較方便也比較容易成功。我以 2.5c 版本為例,將 iPod Touch 接上電腦之後,把 iTunes 關掉,然後選擇選單列的 Mode -> Restart in DFU Mode 即可,如右圖所示:
  • 未知的錯誤 (1403):這代表你之前下載的回復檔有問題,請重新下載。要注意的是你可能要先把瀏覽器的 cache 清空,才能確保有重新下載而非從瀏覽器快取又直接複製一份有問題的檔案出來。
  • 未知的錯誤 (1604):請將 iTunes 降級到 7.5,在 Windows 上要把 iTunes、Quicktime 等都移除重新安裝,Mac 上則請參考這裡。不過我雖然有遇到過這個錯誤訊息,但是當我正確的進入 DFU 模式之後,也可以用 iTunes 7.6 正常降級。
  • 未知的錯誤 (1602):這跟 1604 的錯誤一樣,也請改用 iTunes 7.5 再試試看。
另外,我也遇過破解已經完成,但是 iPod Touch 卻一直停留在回復模式,此時一樣利用 ZiPhone 從 Mode -> Restart in Normal Mode,然後等個幾分鐘之後就會以正常模式重新開機。

標籤: ,

星期二, 二月 26, 2008

iPhone SDK 可能要延遲了!

不知道有多少朋友跟我一樣,最近一直盯著 Apple 主站和 ADC 的 iPhone Dev Center,等待著 Jobs 之前說會在二月發表的 iPhone SDK。

不過壞消息來了...根據 BusinessWeek報導,iPhone SDK 可能要延遲一到三週才會發表。

雖然 Apple 依照慣例不表示意見,但是 BusinessWeek 還是猜了一些原因,不過我們這些寫程式的都知道,東西沒有出來就是因為還沒完成,而為什麼沒辦法照既定時程完成...這可能要問天了吧....哈。

總之,希望 SDK 快點釋出,我用來當工作機的 iPod Touch 都買好了說...

標籤: , , ,

星期四, 十月 25, 2007

iPhone/iPod Touch 軟體開發

雖然 Leopard 發行在即,但這兩天關於 iPhone/iPod Touch 的消息也不少。其中最重要的應該就是 Apple 決定釋出 iPhone 的 SDK,因此以後也可以自己寫 iPhone 的原生程式了,而且 iPod Touch 也適用。
Third Party Applications on the iPhone
Let me just say it: We want native third party applications on the iPhone, and we plan to have an SDK in developers’ hands in February. We are excited about creating a vibrant third party developer community around the iPhone and enabling hundreds of new applications for our users. With our revolutionary multi-touch interface, powerful hardware and advanced software architecture, we believe we have created the best mobile platform ever for developers.
It will take until February to release an SDK because we’re trying to do two diametrically opposed things at once—provide an advanced and open platform to developers while at the same time protect iPhone users from viruses, malware, privacy attacks, etc. This is no easy task. Some claim that viruses and malware are not a problem on mobile phones—this is simply not true. There have been serious viruses on other mobile phones already, including some that silently spread from phone to phone over the cell network. As our phones become more powerful, these malicious programs will become more dangerous. And since the iPhone is the most advanced phone ever, it will be a highly visible target.

Some companies are already taking action. Nokia, for example, is not allowing any applications to be loaded onto some of their newest phones unless they have a digital signature that can be traced back to a known developer. While this makes such a phone less than “totally open,” we believe it is a step in the right direction. We are working on an advanced system which will offer developers broad access to natively program the iPhone’s amazing software platform while at the same time protecting users from malicious programs.

We think a few months of patience now will be rewarded by many years of great third party applications running on safe and reliable iPhones.

Steve

P.S.: The SDK will also allow developers to create applications for iPod touch.
Apple - Hot News
這消息出來之後沒幾天,Apple 又在開發者網站上規劃了一個新的區域 - iPhone Dev Center,雖然目前只有 Web App 放在上面,但未來 SDK 公開之後應該也會以此為中心。

只是這個 SDK 不知道會不會只能在 Mac 上使用,還是會像 Safari 一樣推出 Windows 版呢?總之,應該趕快弄台 iPhone 或 iPod Touch 來玩了 :)

標籤: , , ,