zoukankan      html  css  js  c++  java
  • 随手在网上找了一段将字节数组转换为十六进制字符串的代码,结果被坑惨了

    博文链接:

    c++ byte类型数组转十六进制字符串的几种代码实现

    以下是我根据博文修改格式出来的一个方法:

    string* byteArray2HexStr(char* charArr, int len) {
        string* strRetVal = new string();
        
        for (int i = 0; i < len; i ++) {
            char char1;
            char char2;
            
            int iVal = charArr[i];
            int iVal1 = iVal / 16;
            int iVal2 = iVal % 16;
            
            if (iVal1 >= 0 && iVal1 <= 9) {
                char1 = (char)(48 + iVal1);
            } else {
                char1 = (char)(55 + iVal1);
            }
            
            if (iVal2 >= 0 && iVal2 <= 9) {
                char2 = (char)(48 + iVal2);
            } else {
                char2 = (char)(55 + iVal2);
            }
            
            *strRetVal = *strRetVal + char1 + char2;
        }
        
        return strRetVal;
    }
    刚找到这个东西的时候还是挺开心的,想到以后调试数据会方便些了。

    没想到昨天在调一个 bug 的时候竟然中招了。

    活生生将一个字节数组转换成了错误的十六进制字符串,然后我在做数据对比的时候,让我怀疑是在 bsd socket 的 recv() 方法出现了问题。

    还特意发了一个帖子去向别人请教这个异常奇葩的问题:

    bsd socket 接收缓冲长度不够时接收出错的问题

    详情请看帖子,其他就不多吐槽了,下面给出一个 “不可靠” 的例证:

    #include <string>
    #include <stdio.h>
    #include "HexUtil.h"
    
    using namespace std;
    
    /**
     * 执行结果为:
     * e3 转换结果为:6*
     */
    int main(int argc, const char * argv[]) {
        
        int i = 0xE3;
        
        unsigned char t_pArrChar[1];
        t_pArrChar[0] = (unsigned char)i;
        
        string* str = byteArray2HexStr(t_pArrChar, 1);
        
        printf("%x 转换结果为:%s
    ", i, str->c_str());
    }
    最后,总结一下:

    网上现成的东西,自己拿过来用之前,要记得先做一下测试,检验一下牢固程度。


  • 相关阅读:
    layoutSubviews, setNeedsLayout, layoutIfNeeded
    UIViewController 专题
    UIBarButtonItem
    ios method swizzling
    Method Swizzling
    ios逆向工程
    IOS中通知中心NSNotificationCenter应用总结
    Swift 进阶
    swift 2.0 语法 字符串
    C++Builder中MessageBox的基本用法
  • 原文地址:https://www.cnblogs.com/java20130723/p/3212022.html
Copyright © 2011-2022 走看看