hex文件转换bin文件有两种方式:
1.通过软件的方式,软件的方式我是通过软件J-Flash来转换的。具体操作流程如下:
(1)打开J-Flash选择Create a new project。
(2)把hex文件拖入J-Flash 。
(3)找到hex文件对应的结束的最后一位的位置。
(4)选择Save data file as 保存类型选bin类型,然后点击保存之后弹出Enter address range框 start address 保持不变,End address 输入你想要转换文件的结束地址,然后点击OK hex转bin文件转换成功。
2.通过到代码的方式。转换的代码如下:
//
// 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