iOS hex文件轉(zhuǎn)bin文件

hex文件轉(zhuǎn)換bin文件有兩種方式:

1.通過軟件的方式,軟件的方式我是通過軟件J-Flash來轉(zhuǎn)換的。具體操作流程如下:

(1)打開J-Flash選擇Create a new project。

(2)把hex文件拖入J-Flash 。

(3)找到hex文件對應(yīng)的結(jié)束的最后一位的位置。

(4)選擇Save data file as 保存類型選bin類型,然后點(diǎn)擊保存之后彈出Enter address range框 start address 保持不變,End address 輸入你想要轉(zhuǎn)換文件的結(jié)束地址,然后點(diǎn)擊OK hex轉(zhuǎn)bin文件轉(zhuǎn)換成功。

2.通過到代碼的方式。轉(zhuǎn)換的代碼如下:

//

//? LBHexToBin.m

//

//? Created by lingbing on 2020/9/18.

//

#import

NS_ASSUME_NONNULL_BEGIN

@interface?LBHexToBin : NSObject

+ (NSData*)convert:(NSData*)hex;

@end

NS_ASSUME_NONNULL_END

//

//? LBHexToBin.m

//

//? Created by lingbing on 2020/9/18.

//

#import "LBHexToBin.h"

@implementation?LBHexToBin

+ (constByte)ascii2char:(constByte*)ascii

{

?if(*ascii >='A')

?return*ascii -0x37;

?if(*ascii >='0')

?return*ascii -'0';

?return-1;

}

+ (constByte)readByte:(constByte*)pointer

{

? ? Bytefirst = [LBHexToBinascii2char:pointer];

? ? Bytesecond = [LBHexToBinascii2char:pointer +1];

?return(first <<4) | second;

}

+ (constUInt16)readAddress:(constByte*)pointer

{

? ? Bytemsb = [LBHexToBinreadByte:pointer];

? ? Bytelsb = [LBHexToBinreadByte:pointer +2];

?return(msb <<8) | lsb;

}

+ (NSUInteger)calculateBinLength:(NSData*)hex

{

?if(hex ==nil|| hex.length==0)

? ? {

?return0;

? ? }

? ? NSUIntegerbinLength =0;

?constNSUIntegerhexLength = hex.length;

?constByte* pointer = (constByte*)hex.bytes;

? ? UInt32lastBaseAddress =0;

?do

? ? {

?constBytesemicollon = *pointer++;

? ? ? ? // Validate - each line of the file must have a semicollon as a firs char

?if(semicollon !=':')

? ? ? ? {

?return0;

? ? ? ? }

?constUInt8reclen = [LBHexToBinreadByte:pointer]; pointer +=2;

?constUInt16offset = [LBHexToBinreadAddress:pointer]; pointer +=4;

?constUInt8rectype = [LBHexToBinreadByte:pointer]; pointer +=2;

?switch(rectype) {

?case0x04: {

? ? ? ? ? ? ? ? // Only consistent hex files are supported. If there is a jump to non-following ULBA address skip the rest of the file

?constUInt32newULBA = [LBHexToBinreadAddress:pointer];

?if(binLength >0&& newULBA != (lastBaseAddress >>16) +1)

?returnbinLength;

? ? ? ? ? ? ? ? lastBaseAddress = newULBA <<16;

?break;

? ? ? ? ? ? }

?case0x02: {

? ? ? ? ? ? ? ? // The same with Extended Segment Address. The calculated ULBA must not be greater than the last one + 1

?constUInt32newSBA = [LBHexToBinreadAddress:pointer] <<4;

?if(binLength >0&& (newSBA >>16) != (lastBaseAddress >>16) +1)

?returnbinLength;

? ? ? ? ? ? ? ? lastBaseAddress = newSBA;

?break;

? ? ? ? ? ? }

?case0x00:

? ? ? ? ? ? ? ? // If record type is Data Record (rectype = 0), add it's length (only it the address is >= 0x1000, MBR is skipped)

?if(lastBaseAddress + offset >=0x1000)

? ? ? ? ? ? ? ? ? ? binLength += reclen;

?default:

?break;

? ? ? ? }

? ? ? ? pointer += (reclen <<1);? // Skip the data when calculating length

? ? ? ? pointer +=2;? // Skip the checksum

? ? ? ? // Skip new line

?if(*pointer =='\r') pointer++;

?if(*pointer =='\n') pointer++;

}while(pointer != hex.bytes+ hexLength);

?returnbinLength;

}

+ (NSData*)convert:(NSData*)hex

{

?constNSUIntegerbinLength = [LBHexToBincalculateBinLength:hex];

?constNSUIntegerhexLength = hex.length;

?constByte* pointer = (constByte*)hex.bytes;

? ? NSUIntegerbytesCopied =0;

? ? UInt32lastBaseAddress =0;

Byte* bytes =malloc(sizeof(Byte) * binLength);

? ? Byte* output = bytes;

?do

? ? {

?constBytesemicollon = *pointer++;

? ? ? ? // Validate - each line of the file must have a semicollon as a firs char

?if(semicollon !=':')

? ? ? ? {

? ? ? ? ? ? free(bytes);

?returnnil;

? ? ? ? }

?constUInt8reclen = [LBHexToBinreadByte:pointer]; pointer +=2;

?constUInt16offset = [LBHexToBinreadAddress:pointer]; pointer +=4;

?constUInt8rectype = [LBHexToBinreadByte:pointer]; pointer +=2;

?switch(rectype) {

?case0x04: {

?constUInt32newULBA = [LBHexToBinreadAddress:pointer]; pointer +=4;

?if(bytesCopied >0&& newULBA != (lastBaseAddress >>16) +1)

?return[NSDatadataWithBytesNoCopy:byteslength:bytesCopied];

? ? ? ? ? ? ? ? lastBaseAddress = newULBA <<16;

?break;

? ? ? ? ? ? }

?case0x02: {

?constUInt32newSBA = [LBHexToBinreadAddress:pointer] <<4; pointer +=4;

?if(bytesCopied >0&& (newSBA >>16) != (lastBaseAddress >>16) +1)

?return[NSDatadataWithBytesNoCopy:byteslength:bytesCopied];

? ? ? ? ? ? ? ? lastBaseAddress = newSBA;

?break;

? ? ? ? ? ? }

?case0x00:

? ? ? ? ? ? ? ? // If record type is Data Record (rectype = 0), copy data to output buffer

? ? ? ? ? ? ? ? // Skip data below 0x1000 address (MBR)

?if(lastBaseAddress + offset >=0x1000)

? ? ? ? ? ? ? ? {

?for(inti =0; i < reclen; i++)

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? *output++ = [LBHexToBinreadByte:pointer]; pointer +=2;

? ? ? ? ? ? ? ? ? ? ? ? bytesCopied++;

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? }

?else

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? pointer += (reclen <<1);? // Skip the data

? ? ? ? ? ? ? ? }

?break;

?default:

? ? ? ? ? ? ? ? pointer += (reclen <<1);? // Skip the irrelevant data

?break;

? ? ? ? }

? ? ? ? pointer +=2;? // Skip the checksum

? ? ? ? // Skip new line

?if(*pointer =='\r') pointer++;

?if(*pointer =='\n') pointer++;

}while(pointer != hex.bytes+ hexLength);

?return[NSDatadataWithBytesNoCopy:byteslength:bytesCopied];

}

@end

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容