从 void* 转换为字符串 libwebsocket
Posted
技术标签:
【中文标题】从 void* 转换为字符串 libwebsocket【英文标题】:cast from void* to string libwebsocket 【发布时间】:2013-10-02 12:06:43 【问题描述】:我有一个用 libwebsockets 构建的小型 websocket 服务器,我需要接收一个 string ,问题是接收到的数据是一个 *void,但是我很难将它转换为 string 。
static int my_protocol_callback(struct libwebsocket_context *context,
struct libwebsocket *wsi,
enum libwebsocket_callback_reasons reason,
void *user, void *in, size_t len)
int n, m;
unsigned char buf[LWS_SEND_BUFFER_PRE_PADDING + 512 +
LWS_SEND_BUFFER_POST_PADDING];
unsigned char *p = &buf[LWS_SEND_BUFFER_PRE_PADDING];
switch (reason)
case LWS_CALLBACK_ESTABLISHED:
printf("New Connection\n");
break;
case LWS_CALLBACK_SERVER_WRITEABLE:
break;
case LWS_CALLBACK_RECEIVE:
webcmd = static_cast<std::string*>(in);
break;
case LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION:
break;
default:
break;
return 0;
LWS CALLBACK RECEIVE
情况下,数据为*in
,我用static_cast<std::string*>(in);
投出来的,存储在webcmd字符串中。
问题是结果是一个字符指针,而不是我需要一个真正的字符,因为接下来我需要拆分字符串。
你怎么看?
编辑:解决了问题。
case LWS_CALLBACK_RECEIVE:
下
tmpcmd = reinterpret_cast <char*>(in);
strcpy(webcmd , tmpcmd );
webcmd 是一个字符数组 并且 tmpcmd 是一个字符指针
谢谢大家:D
【问题讨论】:
in 的实际类型是什么?即当你设置回调时,什么会被强制转换为 void*? 【参考方案1】:你不能只 static_cast
对任何你喜欢的东西,并希望它会起作用。不幸的是,您可以在没有警告的情况下将void*
投射到您喜欢的任何东西上。
static_cast
和reinterpret_cast
一样,只是在编译时更改类型,而无需检查指针所指向的内容是否实际代表您将其转换为的类型。
在这种情况下,std::string 是具有多个成员变量和内存表示的复杂类型。而且除非你传入完全相同的类型,否则你会产生灾难性的结果。
传递实际类型会好得多,而不是void*
,但我不知道你正在做什么。
如果你真的需要一个字符串,那么你需要使用std::string
s 构造函数之一。
像这样:
case LWS_CALLBACK_RECEIVE:
std::string command(static_cast<char*>(in));
webcmd = command; //I don't know what webcmd is.
break;
【讨论】:
【参考方案2】:"in" 应该是一些字符数组,你应该这样做:
char * buf = new char[DATA_SIZE];
然后内存将数据作为字符数组(或 BYTE)复制到其中。
【讨论】:
【参考方案3】:一旦将某些内容强制转换为 void*
,所有类型信息都将丢失。
您需要搜索设置回调函数的代码/文档,并转换回最初转换为void*
的实例的数据类型。它可能是std::string*
,但也可能是其他类型,例如char*
。然后,为了使您的代码非常清晰,请使用reinterpret_cast
:
whateverthetypeis* = reinterpret_cast<whateverthetypeis*>(in);
如今,回调可以建模为仿函数或使用模板。然后保留类型信息。您当前使用的机制是对旧 C 时代的回归,当时 void*
被用作泛型类型。
至于想要一个真正的char
;你不会明白的。 char
只是一个介于 -128 和 +127 之间的数字。然而,C 和 C++ 使用 char*(即 char pointer)来建模从char*
表示的内存位置开始的非零字符序列:即字符串。
如果事实证明in
是char*
,那么你可以用in
作为构造函数参数构造一个std::string
,然后随意拆分std::string。
【讨论】:
以上是关于从 void* 转换为字符串 libwebsocket的主要内容,如果未能解决你的问题,请参考以下文章
JSON 不可转换为 void (Openweathermap API)