美文网首页
iOS hex文件转bin文件

iOS hex文件转bin文件

作者: Snow_L | 来源:发表于2021-04-15 13:37 被阅读0次

    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

    相关文章

      网友评论

          本文标题:iOS hex文件转bin文件

          本文链接:https://www.haomeiwen.com/subject/typdlltx.html