hexString_utility

本文提供了一种方法,用于将十六进制数据转换为字符串形式,并能逆向操作返回到原始的十六进制格式。代码包括两个核心函数:Hex2String 和 String2Hex,分别实现了从十六进制到字符串及反向的转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <string.h>
#include <stdio.h>

int Hex2String(unsigned char *src,int srclen,char *des,int deslen) {
    unsigned char Hb;
    unsigned char Lb;

    if (deslen < srclen * 2) return 0;
    memset(des, 0, deslen);

    for (int i = 0; i < srclen;i++) {
        Hb = (src[i] & 0xF0) >> 4; // 高位
        if (Hb <= 9) Hb += 0x30; // 0~9
        else if (Hb >= 10 && Hb <= 15) Hb = Hb - 10 + 'A'; // 10~15
        else return 0;

        Lb = src[i] & 0x0F; // 低位
        if (Lb <= 9) Lb += 0x30;
        else if (Lb >= 10 && Lb <= 15) Lb = Lb - 10 + 'A';
        else return 0;

        des[i * 2] = Hb;
        des[i * 2 + 1] = Lb;
    }
    return 1;
}

int String2Hex(char *src, unsigned char *des) {
    unsigned char Hb, Lb;
    unsigned int len = strlen(src);
    for (int i = 0, j = 0; i < len; i++) {
        Hb = src[i];
        if (Hb >= 'A'&&Hb <= 'F') Hb = Hb - 'A' + 10;
        else if (Hb >= '0'&&Hb <= '9') Hb -= 0x30;
        else return 0;

        i++;
        Lb = src[i];
        if (Lb >= 'A'&&Lb <= 'F') Lb = Lb - 'A' + 10;
        else if (Lb >= '0'&&Lb <= '9') Lb -= 0x30;
        else return 0;

        des[j++] = (Hb << 4) | Lb;
    }
    return 1;
}

// %x & 0xF0
void main() {

    //char b = '1';
    //printf("\n b :%x", b);
    //printf("\n b&0xF0 :%x", (b&0xFF));

    unsigned char src[] = { 0x12,0x34,0x56,0x78,0x90,0xab,0xbc,0xcd,0xde,0xef };
    char des[21];
    Hex2String(src, 10,des, sizeof(des));
    printf("\nsrc :%s ", des);

    if (String2Hex(des, src)) printf("\nconvert Ok .");
    else printf("\nconvert failed .");
}
class connection_metadata_no_tls { public: typedef websocketpp::lib::shared_ptr<connection_metadata_no_tls> ptr; connection_metadata_no_tls(websocketpp::connection_hdl hdl, std::string uri) : m_hdl(hdl) , m_status("Connecting") , m_uri(uri) , m_server("N/A") {} void on_open(client_no_tls *client, websocketpp::connection_hdl hdl) { m_status = "Open"; status_new = true; client_no_tls::connection_ptr con = client->get_con_from_hdl(hdl); m_server = con->get_response_header("Server"); qDebug()<<"on_open hdl"<<hdl._empty(); websocketpp::lib::error_code ec; client->ping(hdl,"heartbeat",ec); } // if connection failed, the function will be invoke. void on_fail(client_no_tls *client, websocketpp::connection_hdl hdl) { m_status = "Failed"; status_new = false; client_no_tls::connection_ptr con = client->get_con_from_hdl(hdl); m_server = con->get_response_header("Server"); m_error_reason = con->get_ec().message(); QDEBUG<<"Err"<<QString::fromStdString(m_error_reason); } void on_close(client_no_tls *client, websocketpp::connection_hdl hdl) { m_status = "Closed"; status_new = false; client_no_tls::connection_ptr con = client->get_con_from_hdl(hdl); std::stringstream s; s << "close code: " << con->get_remote_close_code() << " (" << websocketpp::close::status::get_string(con->get_remote_close_code()) << "), close reason: " << con->get_remote_close_reason(); m_error_reason = s.str(); QDEBUG<<"Close Net"<<QString::fromStdString(m_error_reason); } void on_message(websocketpp::connection_hdl, client_no_tls::message_ptr msg) { if (msg->get_opcode() == websocketpp::frame::opcode::text) { m_messages.push_back(msg->get_payload()); // m_textMessage.append(QString::fromStdString(msg->get_payload()));//Utf8toAscii // m_textMessage = QString::fromUtf8(msg->get_payload()); // QDEBUG<<"得到了数据1"<<m_textMessage; m_binaryMessage.clear(); m_binaryMessage.append(QString::fromStdString(msg->get_payload())); QString string; string.append(m_binaryMessage);// QByteArray转QString方法2 QDEBUG<<"Get Server Message:"<<string; for(int i = 0 ; i < 20 ; i++) { if(messageback[i].is_used == 0 ) { memset(messageback[i].data,0,sizeof(messageback[i].data)); memcpy(messageback[i].data,m_binaryMessage,m_binaryMessage.length()); messageback[i].len = m_binaryMessage.length(); messageback[i].is_used =1 ; break; } } } else { m_messages.push_back(websocketpp::utility::to_hex(msg->get_payload())); // QDEBUG<<"得到了数据2"; } } websocketpp::connection_hdl get_hdl() const { return m_hdl; } std::string get_status() const { return m_status; } std::string get_uri() const { return m_uri; } void record_sent_message(std::string message) { m_messages.push_back(">> " + message); } friend std::ostream & operator<< (std::ostream & out, connection_metadata_no_tls const & data); private: websocketpp::connection_hdl m_hdl; std::string m_status; std::string m_uri; std::string m_server; std::string m_error_reason; std::vector<std::string> m_messages; }; 如何在此段代码中实现定时推送ping功能并支持设置时间间隔
最新发布
07-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是嗨森啦

如果文章还不错,欢迎点赞收藏~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值