成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解Cocoa資源文件嵌入

移動(dòng)開發(fā) iOS
Cocoa資源文件嵌入是本文要介紹的內(nèi)容,軟件開發(fā)中,可能需要把用到的資源文件嵌入到二進(jìn)制執(zhí)行文件中,來看詳細(xì)內(nèi)容。

Cocoa資源文件嵌入是本文要介紹的內(nèi)容,主要是倆學(xué)習(xí)Cocoa/iPhone App/靜態(tài)庫(kù) 嵌入資源文件 rtb v0.1發(fā)布,軟件開發(fā)中,可能需要把用到的資源文件嵌入到二進(jìn)制執(zhí)行文件中,例如生成單個(gè)執(zhí)行文件、防止機(jī)密或版權(quán)信息被PE工具查看或修改、嵌入圖片資源到靜態(tài)庫(kù)中等等。

在Mac OSX Cocoa 或iOS開發(fā)中,編譯生成的Product.app是一個(gè)APP包,其實(shí)就是個(gè)文件夾,右鍵Show Package Contents或者去掉,app 擴(kuò)展后雙擊打開就可以查看包內(nèi)容,修改包里面的任何資源文件都不會(huì)影響程序正常運(yùn)行,要提交到App Store的程序在修改資源文件后運(yùn)行下codesign(安裝Xcode時(shí)已經(jīng)裝了這個(gè)dev tool)重簽名就可以了:

  1. $ codesign -fvs "Your Identity" path/to/appfile.app 

我之前寫的 ElfCodeSigner 就是基于codesign的。

所以嵌入二進(jìn)制資源文件也算是一種有效的保護(hù)手段。

結(jié)合我以前Windows開發(fā)中用到的措施,我想到了三種方案:

Base64編碼。

N久前在CSDN上給一個(gè)網(wǎng)友提供的方法,當(dāng)時(shí)他的需求是對(duì)一些中英文字符串?dāng)?shù)據(jù)的編解碼。我當(dāng)時(shí)給出的Base64方案算是比較簡(jiǎn)便而且行之有效的。Base64方法同樣適用于今天要討論的嵌入資源問題。

NSString 和 NSData可以互轉(zhuǎn),UIImage也提供了initWithData:的創(chuàng)建方法,所以將image data 進(jìn)行base64編碼后保存在一個(gè)NSString常量中,在用到時(shí)進(jìn)行base64解碼再[UIImage initWithData:]。

此方法在處理很小的數(shù)據(jù)時(shí)比較有用,網(wǎng)上也有比較成熟的NSData+Base64類別類供使用。

PNG等資源的壓縮加密

經(jīng)過加密處理的PNG圖像用普通看圖軟件查看時(shí)只能看到一片透明或空白圖帶點(diǎn)斑點(diǎn)這樣的無效圖,但在程序運(yùn)行時(shí)圖像顯示正常,這個(gè)加密方法在j2me、iOS等游戲和應(yīng)用開發(fā)被大量使用。網(wǎng)上現(xiàn)成的加密工具很多,但可以被簡(jiǎn)單的逆向還原原圖。

轉(zhuǎn)換成bytes數(shù)組。

大多數(shù)資源嵌入都采用這種方案,原理很簡(jiǎn)單,把資源文件的每位字符轉(zhuǎn)換成十六進(jìn)制bytes[],幾乎所有語(yǔ)言都提供了bytes[]到data的直接轉(zhuǎn)換。

大多數(shù)十六進(jìn)制編輯器可以將hex結(jié)果保存為文件。被解密或修改比較困難,需要知道圖形基本格式、熟練UE等十六進(jìn)制編輯器、猜測(cè)、運(yùn)氣等。

最近公司項(xiàng)目中需要把一些圖片資源嵌入到靜態(tài)庫(kù)中,我考慮了下還是用bytes的方法比較好,Cocoa原生支持其不會(huì)留下被修改的余地。一些簡(jiǎn)單的圖標(biāo)用CG畫上去。這樣公開出去的庫(kù)只有一個(gè).a文件和幾個(gè)必要的.h文件。

下午閑著沒事,就操起Xcode在新配的MacBook上寫下了我這第一個(gè)跑在Mac OS上的C程序。

Release notes

rtb(Resource To Bytes)是一個(gè)命令行小工具,將二進(jìn)制資源文件轉(zhuǎn)換為bytes數(shù)組,方便在程序中使用嵌入資源。

由于時(shí)間倉(cāng)促,rtb僅在Mac OS SL上測(cè)試過,對(duì)應(yīng)應(yīng)用在Mac OS桌面程序和iOS App中測(cè)試過,以后有時(shí)間再改成跨平臺(tái)的。目前沒發(fā)現(xiàn)什么bug。

使用方法:打開Terminal,cd到rtb所在目錄,運(yùn)行

  1. $ ./rtb image.png  

將生成

  1. unsigned char image_png[] = { ..... };  
  2. unsigned int image_png_len = 16045

變量名稱根據(jù)資源文件名而來,數(shù)字開頭的會(huì)加前綴 "__" ,文件名中非英文和數(shù)字的字符轉(zhuǎn)換為下劃線"_"(使用了isalnum()測(cè)試函數(shù)),在數(shù)組變量名稱添加"_len"后綴作為數(shù)組長(zhǎng)度變量名稱。

例如"123te的 st5.png"將生成變量名

  1. unsigned char __123te____st5_png[] 和 unsigned int __123te____st5_png_len  

Example

首先執(zhí)行rtb生成.h文件:

  1. $ ./rtb test.png > test.png.h 

新建一個(gè)Window Base的iPhone項(xiàng)目,添加test.png.h文件到項(xiàng)目中,在

  1. - (BOOL)application: didFinishLaunchingWithOptions: 

方法中創(chuàng)建一個(gè)UIImage并把它添加到一個(gè)ImageView中:

  1. #import "test.png.h"   
  2. //............   
  3.  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions   
  4.  {   
  5.      [self.window makeKeyAndVisible];   
  6.       8     unsigned char *imgBytes = test_png;   
  7.     NSUInteger imgLenght = test_png_len;  
  8.      NSData *imgData = [NSData dataWithBytesNoCopy:imgBytes length:imgLenght freeWhenDone:NO];11     
  9. // UIImage *image = [UIImage imageWithData:imgData];  
  10.     // or  
  11.      UIImage *image = [[UIImage alloc] initWithData:imgData];  
  12.      15     UIImageView *imageView = [[UIImageView alloc] initWithImage:image];  
  13.      imageView.frame = self.window.frame;  
  14.      imageView.contentMode = UIViewContentModeCenter;  
  15.      [self.window addSubview:imageView];  
  16.      [imageView release];  
  17.     [image release];  
  18.      return YES;  
  19.  } 

因?yàn)樵诔绦蚣虞d時(shí)已經(jīng)將test.png.h中的數(shù)組加載到內(nèi)存中,所以使用NSData的dataWithBytesNoCopy方法即可,不需要再Copy一份,轉(zhuǎn)換成NSData后也不需要釋放它,所以freeWhenDonw參數(shù)值NO.

Code Review

我C語(yǔ)言很爛,就不貼代碼了。注釋、空行加起來80多行,核心功能代碼就是fopen這個(gè)資源文件:

  1. if ((fp = fopen(argv[1], "r")) != NULL)  
  2.  
  3. 從文件頭取到(getc(fp))到EOF,fprintf(stdout,"0x%02x",ch):  
  4.  
  5. for (p = 0; (length < 0 || p < length) && (ch = getc(fp)) != EOF; p++)  
  6. {  
  7.     char *c = p ? ",\n  " : "  ";          
  8.     fprintf(fpo, "%s0x%02x", (p % COLS) ? ", " : c, ch);  

Download

已收錄至Cocoa-Utilities: https://github.com/Sundae/Cocoa-Utilities

小結(jié):詳解Cocoa資源文件嵌入的內(nèi)容介紹完了,希望通過本文的學(xué)習(xí)能對(duì)你有所幫助!

責(zé)任編輯:zhaolei 來源: 互聯(lián)網(wǎng)
相關(guān)推薦

2013-06-17 17:02:15

Windows PhoWP開發(fā)資源文件

2009-08-21 16:13:27

C#讀取資源文件

2011-06-20 14:18:27

Qt 資源 文件

2012-02-03 09:55:06

Delphi

2013-07-30 12:30:57

Windows PhoWindows Pho

2009-08-28 16:08:28

C#利用資源文件

2009-06-02 14:21:04

eclipse資源文件eclipse中文

2011-07-08 18:03:30

Cocoa Touch 網(wǎng)絡(luò)

2011-08-10 18:47:18

Cocoa字符串

2009-12-28 11:23:38

WPF資源文件

2020-08-25 07:16:20

Python資源文件文件

2011-08-15 14:27:51

CocoaRunLoop

2011-08-02 13:58:18

Cocoa 框架 Mac OS

2011-07-28 16:52:34

Cocoa 框架 Mac Os

2011-07-26 15:29:36

Cocoa 模式

2010-01-04 16:23:42

Silverlight

2009-10-28 11:27:34

VB.NET資源文件

2009-06-19 16:12:22

Java語(yǔ)言properties

2009-08-12 16:44:13

.NET文件類型

2009-06-05 09:40:59

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 麻豆成人在线视频 | 精品视频99 | 欧美日韩专区 | 狠狠亚洲| 亚洲最新在线视频 | 国产精品视频网站 | 国产成人精品一区二区 | 手机在线一区二区三区 | av在线一区二区 | 色综合美女 | 久久久久久91| 国产精品欧美一区二区三区不卡 | 亚洲精品亚洲人成人网 | 精品一区二区在线视频 | 北条麻妃国产九九九精品小说 | 日韩在线免费视频 | 国产高清久久久 | 久久影音先锋 | 国产成人精品综合 | 在线观看成人精品 | 亚洲综合资源 | 免费在线黄 | 黑人巨大精品欧美一区二区一视频 | aa级毛片毛片免费观看久 | 欧美做暖暖视频 | 自拍偷拍中文字幕 | 国产精品区一区二区三区 | 国产一区视频在线 | 成人在线免费网站 | 日日日色 | 国产日韩精品视频 | 看一级黄色毛片 | 最新毛片网站 | 日韩91在线 | 天天做日日做 | 91国产视频在线观看 | 久久久久久久久久久久91 | 欧美极品在线 | 亚洲国产精品一区在线观看 | 色视频www在线播放国产人成 | 日韩成人在线电影 |