• C++-json(2)-unsigned char-unsigned char*-memcpy-strcpy-sizeof-strlen


    1.类型转换

    1. //1.赋值一个不知道长度的字符串
    2. unsigned char s[] = "kobe8llJfFwFSPiy"; //1.用一个字符串初始化变量
    3. unsigned int s_length = strlen((char*)s); //2.获取字符串长度
    4. //2.字符串里有双引号"" 需要加\ 长度数据类型:size_t
    5. const unsigned char sjson[] = "{\"name\":\"MABMEC3F8\", \"value\" : \"W6tvvyYEF7ZkFH8V\" }";
    6. size_t sjson_length = strlen((char*)sjson);
    7. //3.两个 unsigned char*之间的拷贝:unsigned char* pSrc, unsigned char* pDest
    8. unsigned char* pSrc="ABC123";
    9. size_t npSrclen =strlen((char*)pSrc);
    10. unsigned char* pDest=new unsigned char[npSrclen];
    11. memcpy(pDest, pSrc, npSrclen);

    1. //1.static_cast 相近类型
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. double d = 12.34;
    7. int a = static_cast<int>(d);
    8. return 0;
    9. }
    10. //2.reinterpret_cast 不相关类型
    11. typedef void(*FUNC) ();
    12. int DoSomething(int i)
    13. {
    14. cout << "DoSomething" << endl;
    15. return 0;
    16. }
    17. int main()
    18. {
    19. //reinterpret_cast可以让编译器以FUNC的定义方式去看待DoSomething函数
    20. //所以非常的BUG,下面的转换函数指针的代码时不可移植的,所以不建议使用
    21. //C++不保证所有的函数指针都被一样使用,所以这样用有时会产生不确定的结果
    22. FUNC f = reinterpret_cast(DoSomething);
    23. f();
    24. system("pause");
    25. return 0;
    26. }
    27. //3.const_cast 删除变量的const属性
    28. int main()
    29. {
    30. volatile const int a = 2;
    31. int* p = const_cast<int*>(&a);
    32. *p = 3;
    33. cout << a << endl;
    34. system("pause");
    35. return 0;
    36. }
    37. //4.explicit关键字阻止转换构造函数进行的隐式类型转换的发生
    38. class A
    39. {
    40. public:
    41. explicit A(int a)
    42. {
    43. cout << "A(int a)" << endl;
    44. }
    45. A(const A* a)
    46. {
    47. cout << "const A* a" << endl;
    48. }
    49. private:
    50. int _a;
    51. };
    52. int main()
    53. {
    54. A a1(1); //隐式转换--A tmp(1); A a2(tmp)
    55. A a2 = 1;
    56. system("pause");
    57. return 0;
    58. }

    1. int main()
    2. {
    3. unsigned char data[] = {0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x57, 0x6F, 0x72, 0x6C, 0x64};
    4. int len = sizeof(data) / sizeof(unsigned char);
    5. string str(data, data+len);
    6. return 0;
    7. }

    3.  拷贝 一定要new 

    1. //1. 不new
    2. unsigned char* pSrc1 = (unsigned char*)(s_data_offset_.c_str());
    3. int Srclen1 = strlen((char*)pSrc1);
    4. unsigned char pcopy1[] = { 0 };
    5. memcpy(pcopy1, pSrc1, Srclen1 ); //debug 显示字符串中的字符无效
    6. int copy1len = strlen((char*)pcopy1); //长度 24个 0x18
    7. //2.new 长度变了 16->21个 多出的字符为空字符
    8. unsigned char* pSrc2 = (unsigned char*)(s_data_offset_.c_str());
    9. int Srclen2 = strlen((char*)pSrc2);
    10. //int m_sconst = static_cast(Srclen2); 变量变常量
    11. unsigned char* pcopy2 = new unsigned char[Srclen2]; //长度 21个 0x15
    12. memcpy(pcopy2, pSrc2, Srclen2 ); //pcopy2 显示 pSrc中的字符
    13. size_t copy2len = strlen((char*)pcopy2);
    14. //3.去掉后面的字符串
    15. unsigned char* pcopy3 = mytrim(pcopy2, Srclen2);
    16. size_t copy3len = strlen((char*)pcopy3);

    4.copy 出来的是有空字符串的
                去掉空字符串

    1. //3.去掉 原始的是16-实际的是21 相差5个
    2. //字符串去空格
    3. unsigned char* mytrim(unsigned char* pSrc, int pSrcLen)
    4. {
    5. unsigned char* copy = (unsigned char*)malloc(pSrcLen);
    6. memset(copy, 0, pSrcLen);
    7. unsigned int i = 0, j = 0;
    8. for (i = 0; i < pSrcLen; i++)
    9. {
    10. if (pSrc[i] != ' ')
    11. {
    12. copy[j++] = pSrc[i];
    13. }
    14. }
    15. copy[j] = '\0';
    16. int strCopy2len = strlen((char*)copy);
    17. return copy;
    18. }

    5.数据长度

    strlen() 只有遇到'\0'才会停止计算,同时计算的长度不包含'\0',否则就是个随机值

    1. #include
    2. #include
    3. //当计算长度时,只有遇到'\0'才会停止计算,同时计算的长度不包含'\0'。
    4. int main()
    5. {
    6. char arr[10] = "abcde";
    7. int num = strlen(arr);
    8. printf("数组arr的长度为:%d\n", num); //数据长度为5
    9. return 0;
    10. }
    11. int main()
    12. {
    13. char arr[] = { 'a','b','c','d','e' };
    14. int num = strlen(arr);
    15. printf("数组arr的长度:%d\n", num); //数据长度为 19 此处返回的是一个随机值
    16. return 0;
    17. }



     

  • 相关阅读:
    自动化运维CICD
    Netty的拆包粘包问题
    java-net-php-python-SSM公共租赁住房信息管理系统录像计算机毕业设计程序
    Cadence OrCAD Capture 关键网络逐个检查方法
    分享自己平时使用的socket多客户端通信的代码技术点和软件使用
    [手写spring](2)初始化BeanDefinitionMap
    MySQL 深分页优化
    YashanDB个人版正式开放下载!参与首批体验官活动赢好礼!
    怎么获取外网ip地址
    适配器模式和装饰器模式
  • 原文地址:https://blog.csdn.net/aggie4628/article/details/133885989