例如,如果我有一个值为unsigned char *str
的{{1}},该如何为该数组加上两个空字节作为前缀,这样该数组将变成0x68 0x65 0x6C 0x6C 0x6F
([0x00 0x00] 0x68 0x65 0x6C 0x6C 0x6F
=添加字节)?
我尝试使用[]
,但是由于我想strcat
字节被视为字符串终止符,因此无法产生预期的结果。
例如,如果我有一个值为unsigned char *str
的{{1}},该如何为该数组加上两个空字节作为前缀,这样该数组将变成0x68 0x65 0x6C 0x6C 0x6F
([0x00 0x00] 0x68 0x65 0x6C 0x6C 0x6F
=添加字节)?
我尝试使用[]
,但是由于我想strcat
字节被视为字符串终止符,因此无法产生预期的结果。
函数strcat
用于处理字符串,即以零结尾的字符数组。由于您的数组不是以零结尾的,因此您不应使用此函数。
相反,如果要避免手动编码运动,则可以使用memmove
和memset
函数。但是,您需要声明str
数组,且其大小为(更大)(以适应添加的字节)。
因此,例如:
unsigned char str[7] = { 0x68,0x65,0x6C,0x6F,}; // Note: size must be at least 7
//.. some code
memmove(str+2,str,5); // Shift along by two bytes (see note,below)
memset(str,2); // Add the two 'prefix' zeros
请注意,memmove
函数是safe with overlapping buffers(在我的脑海中):
将num字节的值从源指向的位置复制到 目标指向的内存块。
复制发生在 如果使用了中间缓冲区,则允许目的地和 源重叠。
但是,这仅适用于功能memmove
,不适用于功能memcpy
。使用函数memcpy
,缓冲区重叠是不安全的。
此外,请注意,unsigned char *str
并未声明数组(尽管您可以对string literals使用类似的语法)。您需要使用已发布代码的(现在已更正)版本。