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