C++ 将solace专有二进制消息输入sscanf

C++ 将solace专有二进制消息输入sscanf,c++,c,solace,C++,C,Solace,我发出这样的信息: char buffer[175]; sprintf(buffer, "MD: %4ld %2d %10s %5s %7.2f %5d\n" , id , position , *(MktDepthOperation::ENUMS) operation , *(MktDeptSide::ENUMS)side , price , size); PrintProcessId, printf(buffer); SolSendMessa

我发出这样的信息:

char buffer[175];
sprintf(buffer, "MD: %4ld %2d %10s %5s %7.2f %5d\n"
    , id
    , position
    , *(MktDepthOperation::ENUMS) operation
    , *(MktDeptSide::ENUMS)side
    , price
    , size);

PrintProcessId, printf(buffer);
SolSendMessage("testhello", buffer);
...

void SolSendMessage(const char* topic, const char *text_p)
{
    ...
    if (s_canSend) {
            if ((rc = solClient_session_sendMsg(session_p, msg_p)) != SOLCLIENT_OK) {
...
}
在副作用方面,我只是在传递信息如何从编码solace专有格式的二进制缓冲区中检索字段?我试图避免使用
谷歌协议缓冲区
,并使用推荐的
solace专有格式

solClient_rxMsgCallback_returnCode_t
messageReceiveCallback ( solClient_opaqueSession_pt opaqueSession_p, solClient_opaqueMsg_pt msg_p, void *user_p )
{
    //printf ( "Received message:\n" );
    solClient_msg_dump ( msg_p, NULL, 0 );
    printf ( "\n" );

    msgCount++;

    return SOLCLIENT_CALLBACK_OK;
}

您的代码片段不清楚如何在消息上设置缓冲区。要使用Solace API简单地发送和接收消息二进制附件中的字符串,可以在发送时使用solClient_msg_setBinaryAttachment,在接收时使用solClient_msg_getBinaryAttachment检索字符串。不建议sscanf solClient_msg_dump的输出,因为这将包括有关消息头的额外信息。此消息转储实用程序作为编程辅助工具提供,以促进消息应用程序的开发和测试,而不是直接提取消息中的数据

另一种选择是使用Solace结构化数据类型。Solace SDT是结构化、独立于语言和体系结构的数据类型。它们可以在消息中使用,以便于在具有使用不同硬件体系结构和编程语言的客户端的异构网络中交换二进制数据。如果要发送固定的数据结构,可以使用“CreateBaryAttachmentStream”创建结构化数据流

e、 g.如果您有固定的数据结构,如:

struct MD {
        long id;
        int position;
        char operation[10];
        char side[5];
        float price;
        int size);
    }
您可以创建结构化数据流,然后为每个成员调用
addInt64/addInt32/addString/addString/addFloat/addInt
。在接收端,您可以通过调用
getInt64/getInt32
等来检索数据结构成员。否则,如果您没有使用已知的数据结构,则可以使用映射而不是流,并适当地命名每个字段

有关Solace结构化数据类型的更多信息,请访问:

errr垃圾场到底是什么样子的?根据输出,您可能需要使用复杂的解析来获得结果。看起来您需要
solClient\u msg\u dump(msg\u p,buffer,buffer\u size)
,然后正常地对缓冲区进行sscanf。