考虑这个USB字符串描述符:
#define USB_PRODUCT_STRING_DESCRIPTOR_LENGTH (34U)
#define USB_DESCRIPTOR_TYPE_STRING (0x03U)
uint8_t UsbProductString[USB_PRODUCT_STRING_DESCRIPTOR_LENGTH] = {
USB_PRODUCT_STRING_DESCRIPTOR_LENGTH,
USB_DESCRIPTOR_TYPE_STRING,
'C', 0x00U,
'O', 0x00U,
'M', 0x00U,
'P', 0x00U,
'O', 0x00U,
'S', 0x00U,
'I', 0x00U,
'T', 0x00U,
'E', 0x00U,
' ', 0x00U,
'D', 0x00U,
'E', 0x00U,
'V', 0x00U,
'I', 0x00U,
'C', 0x00U,
'E', 0x00U,
};
有没有办法以更容易阅读的方式表现它?可能使用u""
字符串语法?
答案 0 :(得分:0)
如何将unicode字符串文字与字节连接?
我认为没有办法解决标题问题。
有没有办法以更容易阅读的方式表现它?可能使用你的""字符串语法?
没有简单的方法来清楚地处理连接3个字段。
回想一下,u"some text"
与char16_t
一起使用,可能/可能不代表UTF-16
编码。
也许简单使用3字段类型?
#include <stddef.h>
#include <uchar.h>
#include <stdio.h>
//#define USB_PRODUCT_STRING_DESCRIPTOR_LENGTH (34U)
#define USB_DESCRIPTOR_TYPE_STRING 1
#define UPS_SIZE(S) (sizeof(uint8_t) + sizeof(uint8_t) + sizeof(S) - 2 /*null character*/)
typedef struct {
uint8_t length;
uint8_t descriptor_type;
char16_t descriptor[127]; // 127 Maximum length
} USBProductString_T;
int main(void) {
#if __STDC_UTF_16__ == 1
puts("values of type char16_t are UTF-16 encoded.");
#else
puts("values of type char16_t are not known to be UTF-16 encoded.");
return 0;
#endif
#define COMPOSITE_DEVICE u"COMPOSITE DEVICE"
USBProductString_T UsbProductString =
{ UPS_SIZE(COMPOSITE_DEVICE), USB_DESCRIPTOR_TYPE_STRING, COMPOSITE_DEVICE };
printf("%u %u %zu\n", 1U*UsbProductString.length, 1U*UsbProductString.descriptor_type,
sizeof UsbProductString);
return 0;
}
输出
values of type char16_t are UTF-16 encoded.
34 1 256
进一步解决OP附加限制 - 空格:
从常量类型中解耦常量。使用char16_t[]
形成UsbProductString
,然后进行特殊的后初始化/复制/比较/创建功能以使用它。各种方法取决于未陈述的设计约束。
static char16_t UsbProductString[] = u"COMPOSITE DEVICE";
void FormString(uint8_t buf[], const char16_t *s) {
unsigned bi = 0,si = 0;
buf[++bi] = USB_DESCRIPTOR_TYPE_STRING
while (s[si]) {
buf[++bi] = s[si] % 256;
buf[++bi] = s[si] / 256;
si++;
}
buf[0] == ++bi;
}
uint8_t buf[sizeof UsbProductString - 2 + 2]; // string has an unneeded null character
FormString(buf, UsbProductString);
Send(buf);
你的帖子想要一个具有1)灵活数组成员的结构,2)用初始化值声明它。据我了解C,这是不可能的。你是正确的考虑UsbProductString[]
一个数组,并尝试将第一个字段楔入一个字符串的一部分,但这会牺牲可读性 - 试图创建&#34; UTF-16&#34; uint8_t
数据。