将字符串转换为无符号字符 []
Posted
技术标签:
【中文标题】将字符串转换为无符号字符 []【英文标题】:Convert a string to and unsigned char [] 【发布时间】:2011-04-27 04:02:21 【问题描述】:我目前有一个这样的数据包设置:
struct Packet
unsigned short sequenceNumber;
unsigned short length;
unsigned char control;
unsigned char ack;
unsigned short crc;
unsigned char data[];
Packet copy(const Packet& aPacket)
sequenceNumber = aPacket.sequenceNumber;
length = aPacket.length;
control= aPacket.control;
ack = aPacket.ack;
crc = aPacket.crc;
memcpy (data, aPacket.data, aPacket.length);
;
这个数据包被转换成一个字符串进行加密,然后需要从它的解密字符串形式取回一个数据包。我可以对除unsigned char data[]
之外的所有变量执行此操作。我尝试了以下方法但没有成功:
string data = thePack.substr(pos, thePack.length()-pos);
unsigned char * cData = new unsigned char[data.length()];
strcpy((char *)cData, data.c_str());
memcpy(p.data, cData, data.length());
其中 data 是要复制到 unsigned char []
中的数据的字符串表示形式,p 是数据包。
这从 valgrind 得到以下信息:
==16851== Invalid write of size 1
==16851== at 0x4A082E7: strcpy (mc_replace_strmem.c:303)
即使它引用 strcpy
作为源代码,它也可以编译并运行良好,只需注释掉 memcpy
行。
我也尝试用strcpy
替换memcpy
,结果相同。有任何想法吗?我觉得这可能是因为数据可能尚未初始化并且没有分配任何内存,但我认为memcpy
会解决这个问题。
【问题讨论】:
【参考方案1】:您尚未指定data
数组的大小。
unsigned char data[];
这是合法的,但很难使用。 data
数组将跟随内存中 Packet
结构的其余部分,但编译器不知道为其分配多少空间。所以你必须自己分配额外的空间:
size_t datalen = thePack.length()-pos;
void* pbuffer = malloc( sizeof (Packet) + datalen + 1 );
Packet* p = new (pbuffer) Packet;
memcpy(p.data, &thePack[pos], datalen);
p.data[datelen] = 0;
让编译器决定Packet
的大小是行不通的,要么使用new Packet
,要么使用局部变量Packet p;
。最终将没有为data
保留空间。不,memcpy
不分配内存。
一个更简洁的解决方案是使用std::vector
作为可变大小的数据数组。
【讨论】:
非常感谢,这正是我想要的!【参考方案2】:您分配的 char[]
太小了一个字符 - 您必须为末尾的 NULL 字节留出空间:
unsigned char * cData = new unsigned char[data.length() + 1];
使用strcpy
版本复制字符串,因此NULL 字节被正确复制。尽管没有那个 +1 它可能运行良好,但不能保证,有时它可能会崩溃。
【讨论】:
感谢您的回复,我刚试过这个,没有骰子。还有其他想法吗?以上是关于将字符串转换为无符号字符 []的主要内容,如果未能解决你的问题,请参考以下文章