• 学习open62541 --- [66] UA_String的生成方法


    UA_String是比较特殊的类型,其原型如下,是个结构体,

    /**
     * String
     * ^^^^^^
     * A sequence of Unicode characters. Strings are just an array of UA_Byte. */
    typedef struct {
        size_t length; /* The length of the string */
        UA_Byte *data; /* The content (not null-terminated) */
    } UA_String;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    平时使用C/C++时,字符串一般使用char型数组或者std::string来表示,与UA_String稍有不同,使用时有时容易掉坑里。

    本文主要讲述UA_String的相关生成方法。


    相关API

    生成UA_String的API有三个,如下,

    • UA_STRING
    • UA_STRING_ALLOC
    • UA_STRING_STATIC

    下面分别介绍,

    1. UA_STRING

    其原型如下,

    /**
     * ``UA_STRING`` returns a string pointing to the original char-array.
     * ``UA_STRING_ALLOC`` is shorthand for ``UA_String_fromChars`` and makes a copy
     * of the char-array. */
    static UA_INLINE UA_String
    UA_STRING(char *chars) {
        UA_String s; s.length = 0; s.data = NULL;
        if(!chars)
            return s;
        s.length = strlen(chars); s.data = (UA_Byte*)chars; return s;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    字符串需要事先存在,然后把其地址传给UA_STRING(),使用方法如下,

    const char *aa = "hello";
    UA_String ustring1 = UA_STRING((char*)aa);
    
    std::string tt = "world";
    UA_String ustring2 = UA_STRING((char*)tt.data());
    
    char arr[128] = "hhheee";
    UA_String ustring3 = UA_STRING(arr);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    需要注意的是,由于需要字符串事先存在,所以在后续使用时要保证空间是有效的,否则会出现段错误。

    2. UA_STRING_ALLOC

    这是个宏定义,如下,

    #define UA_STRING_ALLOC(CHARS) UA_String_fromChars(CHARS)
    
    • 1

    是对UA_String_fromChars()的重定义,这个函数会对传入的字符串进行拷贝(使用动态内存),不会影响原先的字符串

    UA_String ustring = UA_STRING_ALLOC("hello");
    
    • 1

    如果不想后续操作会影响原先的字符串,那么就使用这个宏来生成UA_String

    3. UA_STRING_STATIC

    这也是个宏定义,如下,

    /* Define strings at compile time (in ROM) */
    #define UA_STRING_STATIC(CHARS) {sizeof(CHARS)-1, (UA_Byte*)CHARS}
    
    • 1
    • 2

    需要字符串事先存在,不会拷贝。这个宏只适用于如下2种形式,

    char arr[128] = "hhheee";
    UA_String ustring1 = UA_STRING_STATIC(arr);
    
    UA_String ustring2 = UA_STRING_STATIC("wwweee");
    
    • 1
    • 2
    • 3
    • 4

    不能这样写,

    const char *aa = "hello";
    UA_String ustring1 = UA_STRING_STATIC(aa);
    
    • 1
    • 2

    为什么?因为其使用了sizeof来获取字符串的字节数,这就体现了数组名和指针的区别,如下面的例子,

    char aa[128];
    sizeof(aa); // 等于128
    
    char *ptr = aa;
    sizeof(aa); // 等于指针长度,为4或者8
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这是个潜在的坑,一不小心就掉进去了。同样,由于需要字符串事先存在,所以在后续使用时要保证空间是有效的,否则会出现段错误。


    小结

    本文主要讲述了生成UA_String的三个API,及其注意事项。

  • 相关阅读:
    Windows 应用程序监控重启
    【hadoop | hive】hive on spark教程
    React教程之 React 中的高阶组件 (HOC) 简介
    管理Linux终端的screen命令示例
    Sql查询所有子级元素
    今日伦敦金行情怎样分析?
    UnboundLocalError: local variable ‘x‘ referenced before assignment 分析
    rhcsa-文件内容显示
    关于java语言当中的this关键字
    WPF 使用Image控件显示图片
  • 原文地址:https://blog.csdn.net/whahu1989/article/details/125548009