我想在C中创建一个全局22字符(+NULL)字符串。我正在初始化它,如下所示:

#define SVN_REVISION     "1143"
#define SERIAL_NUMBER    "PST3201109270001"
char general_info[23] = SVN_REVISION SERIAL_NUMBER SAMPLING_FREQUENCY;

到目前为止,这个方法还不错。一般信息由两个字符串的连接初始化。现在,对于最后两个字符,我希望它们是16位整数。但我不能这么简单:
#define SVN_REVISION          "1143"
#define SERIAL_NUMBER         "PST3201109270001"
#define SAMPLING_FREQUENCY    (UINT16)500
char general_info[23] = SVN_REVISION SERIAL_NUMBER SAMPLING_FREQUENCY SAMPLING_FREQUENCY;

我能做什么?

最佳答案

如果您的意思是希望将16位整数500作为二进制数据嵌入字符串末尾,则可以使用原始十六进制字节:

/* Little-endian unsigned 16-bit integer with the value 500 */
#define SAMPLING_FREQUENCY    "\xf4\x01"

不过,请注意,endianness依赖于体系结构,因此您可能需要添加一个额外的宏来根据体系结构正确排序字节:
#ifdef ... /* little endian */
#define BYTES2(a,b) b a
#else ... /* big endian */
#define BYTES2(a,b) a b
#endif
#define SAMPLING_FREQUENCY    BYTES16("x01", "\xf4")

编辑:如果您想要一个可读的数字,那么您不能在编译时拥有它(至少不能在C中),但是您可以在运行时初始化它:
#define SVN_REVISION     "1143"
#define SERIAL_NUMBER    "PST3201109270001"
#pragma pack(push, 1)
union {
    struct {
        char svn_rev_serial[20];
        uint16_t freq;
        char nul;
    };
    char general_info[23];
} u = {{
    SVN_REVISION SERIAL_NUMBER,
    500,
    '\0'
}};
#pragma pack(pop)

这将使用更多的非标准(但支持良好)结构,如#pragma pack和向一个联合成员写入和从另一个联合成员读取。

关于c - 如何用16位整数初始化C字符串?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7582811/

10-11 22:35
查看更多