⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xhexcode.cpp

📁 BCB的学习资料
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    OutBuffer.ensureCapacity( DataCount /2 +1 );
    const XChar * btData = (const XChar *)srcData;
    int iFree = DataCount / 2;
    for(int i=0; i<iFree; i++)
    {
        XByte btTmp1 = 0, btTmp2 = 0;
        XChar ch1 = * btData++;
        XChar ch2 = * btData++;

        if( ch1 <= '9' && ch1 >='0' ) btTmp1 = (XByte)(ch1 - '0');
        else if( ch1 <= 'F' && ch1 >= 'A' ) btTmp1 = (XByte)(ch1 - 'A' + 10);
        else if( ch1 <= 'f' && ch1 >='a' ) btTmp1 = (XByte)(ch1 -'a' + 10);
        else if(bBreakByError) return;
        if( ch2 <= '9' && ch2 >='0' ) btTmp2 = (XByte)(ch2 - '0');
        else if( ch2 <= 'F' && ch2 >= 'A' ) btTmp2 = (XByte)(ch2 - 'A' + 10);
        else if( ch2 <= 'f' && ch2 >='a' ) btTmp2 = (XByte)(ch2 -'a' + 10);
        else if(bBreakByError) return;
        OutBuffer.AppendByte( (XByte)((btTmp1 << 4) | btTmp2) );
    }
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]Decode
[Title]将16进制数据串解码,并放到缓冲区中
////////////////////////////////////////////////////////////////////////////////
[Param]
    <cconst AnsiString &>srcData   源数据,将被解码的16进制串数据
    <int>DataCount 数据源的字节数
    <XByteBuffer &>OutBuffer 解码后,存放数据组的缓冲区
    <bool default = true>bBreakByError 表示遇到错误非十六进制字符是否退出返回,true则表示退出返回,
    false则将数据视为0继续解码
[Return]
    void
[Exception]
    EOutOfMemory 如果申请缓冲区失败,那么则抛出该异常
[Description]
    将16进制数据串解码,并放到缓冲区中。
[Version]1.0
[Author]Rex Winter
[Date]2005-6-24
////////////////////////////////////////////////////////////////////////////////
*/
void XHexCode::Decode(const AnsiString & srcData,XByteBuffer & OutBuffer,bool bBreakByError)
{
    Decode((const void *)srcData.c_str(),srcData.Length(),OutBuffer,bBreakByError);
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]Decode
[Title]将16进制数据串解码,并放到缓冲区中
////////////////////////////////////////////////////////////////////////////////
[Param]
    <const XByteBuffer &>srcData   源数据,将被解码的16进制串数据
    <int>DataCount 数据源的字节数
    <XByteBuffer &>OutBuffer 解码后,存放数据组的缓冲区
    <bool default = true>bBreakByError 表示遇到错误非十六进制字符是否退出返回,true则表示退出返回,
    false则将数据视为0继续解码
[Return]
    void
[Exception]
    EOutOfMemory 如果申请缓冲区失败,那么则抛出该异常
[Description]
    将16进制数据串解码,并放到缓冲区中。
[Version]1.0
[Author]Rex Winter
[Date]2005-6-24
////////////////////////////////////////////////////////////////////////////////
*/
void XHexCode::Decode(const XByteBuffer & srcData,XByteBuffer & OutBuffer,bool bBreakByError)
{
    Decode(srcData.Data(),srcData.Length,OutBuffer,bBreakByError);
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]Decode
[Title]将16进制数据串解码,并放到缓冲区中
////////////////////////////////////////////////////////////////////////////////
[Param]
    <const void *>srcData   源数据,将被解码的16进制串数据
    <int>DataCount 数据源的字节数
    <XByteBuffer &>OutBuffer 解码后,存放数据组的缓冲区
    <bool default = true>bBreakByError 表示遇到错误非十六进制字符是否退出返回,true则表示退出返回,
    false则将数据视为0继续解码
[Return]
    <AnsiString> 返回解码压的字符串
[Exception]
    EOutOfMemory 如果申请缓冲区失败,那么则抛出该异常
[Description]
    将16进制数据串解码,并放到缓冲区中。
[Version]1.0
[Author]Rex Winter
[Date]2005-6-24
////////////////////////////////////////////////////////////////////////////////
*/
AnsiString XHexCode::Decode(const void * srcData,int DataCount,bool bBreakByError)
{
    XByteBuffer OutBuffer;
    OutBuffer.ensureCapacity( DataCount /2 +1 );
    Decode(srcData,DataCount,OutBuffer,bBreakByError);
    OutBuffer.AppendChar(0);
    return (const char *)OutBuffer.Data();
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]Decode
[Title]将16进制数据串解码,并放到缓冲区中
////////////////////////////////////////////////////////////////////////////////
[Param]
    <const AnsiString &>srcData   源数据,将被解码的16进制串数据
    <int>DataCount 数据源的字节数
    <XByteBuffer &>OutBuffer 解码后,存放数据组的缓冲区
    <bool default = true>bBreakByError 表示遇到错误非十六进制字符是否退出返回,true则表示退出返回,
    false则将数据视为0继续解码
[Return]
    <AnsiString> 返回解码压的字符串
[Exception]
    EOutOfMemory 如果申请缓冲区失败,那么则抛出该异常
[Description]
    将16进制数据串解码,并放到缓冲区中。
[Version]1.0
[Author]Rex Winter
[Date]2005-6-24
////////////////////////////////////////////////////////////////////////////////
*/
AnsiString XHexCode::Decode(const AnsiString & srcData,bool bBreakByError)
{
    XByteBuffer OutBuffer;
    OutBuffer.ensureCapacity( srcData.Length() / 2 + 1 );
    Decode(srcData,OutBuffer,bBreakByError);
    OutBuffer.AppendChar(0);
    return (const char *)OutBuffer.Data();
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]Decode
[Title]将16进制数据串解码,并放到缓冲区中
////////////////////////////////////////////////////////////////////////////////
[Param]
    <const XByteBuffer &>srcData   源数据,将被解码的16进制串数据
    <int>DataCount 数据源的字节数
    <XByteBuffer &>OutBuffer 解码后,存放数据组的缓冲区
    <bool default = true>bBreakByError 表示遇到错误非十六进制字符是否退出返回,true则表示退出返回,
    false则将数据视为0继续解码
[Return]
    <AnsiString> 返回解码压的字符串
[Exception]
    EOutOfMemory 如果申请缓冲区失败,那么则抛出该异常
[Description]
    将16进制数据串解码,并放到缓冲区中。
[Version]1.0
[Author]Rex Winter
[Date]2005-6-24
////////////////////////////////////////////////////////////////////////////////
*/
AnsiString XHexCode::Decode(const XByteBuffer & srcData,bool bBreakByError)
{
    XByteBuffer OutBuffer;
    OutBuffer.ensureCapacity( srcData.Length /2 + 1 );
    Decode(srcData,OutBuffer,bBreakByError);
    OutBuffer.AppendChar(0);
    return (const char *)OutBuffer.Data();
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]__EncodeToBuffer
[Title]将一个Byte数据转换成十六进制字符并到缓冲区中
////////////////////////////////////////////////////////////////////////////////
[Param]
    <const XByte>btTmp   源数据,将被编码的字节
    <XByteBuffer &>OutBuffer 存放数据的缓冲区
    <bool default = true>bCase 表示生成十六进制串的大小写,true表示为大写,false表示为小写 
[Return]
    <void>
[Exception]
    EOutOfMemory 如果申请缓冲区失败,那么则抛出该异常
[Description]
    将一个Byte数据转换成十六进制字符并到缓冲区中
[Version]1.0
[Author]Rex Winter
[Date]2005-6-24
////////////////////////////////////////////////////////////////////////////////
*/
void XHexCode::__EncodeToBuffer(const XByte btTmp,XByteBuffer & OutBuffer,bool bCase)
{
    OutBuffer.ensureCapacity( OutBuffer.GetLength() + 2 );
    if( bCase )
    {
        XByte bt1 =(XByte)(btTmp & 0x0f);
        XByte bt2 =(XByte)(btTmp >> 4);
        if( bt2 < 10 ) OutBuffer.AppendChar((XChar)('0'+bt2));
        else OutBuffer.AppendChar((XChar)('A'-10+bt2));
        if( bt1 < 10 ) OutBuffer.AppendChar((XChar)('0'+bt1));
        else OutBuffer.AppendChar((XChar)('A'-10+bt1));
    }
    else
    {
        XByte bt1 =(XByte)(btTmp & 0x0f);
        XByte bt2 =(XByte)(btTmp >> 4);
        if( bt2 < 10 ) OutBuffer.AppendChar((XChar)('0'+bt2));
        else OutBuffer.AppendChar((XChar)('a'-10+bt2));
        if( bt1 < 10 ) OutBuffer.AppendChar((XChar)('0'+bt1));
        else OutBuffer.AppendChar((XChar)('a'-10+bt1));
    }
}


}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -