【问题标题】:APNS. C++: extract Identifier from error responceAPNS。 C++:从错误响应中提取标识符
【发布时间】:2014-04-19 23:40:18
【问题描述】:

我有一个发送 Apple 推送通知的 C++ 应用程序

它使用增强的通知格式https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/LegacyFormat.html#//apple_ref/doc/uid/TP40008194-CH105-SW5

有时我收到错误并想正确解析它

这是对错误响应格式的解释: https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/CommunicatingWIthAPS.html#//apple_ref/doc/uid/TP40008194-CH101-SW4

我们有 1 个字节的命令、1 个字节的状态和 4 个字节的标识符。 我在提取标识符时遇到问题

这是我的代码如何提取命令和状态

 char data[6];
 ...
 int Command = data[0];
 int Status = data[1];
 int Identifier = ...;

请帮助我识别标识符

【问题讨论】:

    标签: c++ c apple-push-notifications


    【解决方案1】:

    如果您的问题是用四个字节制作一个整数,可以这样做:

    char data[6];
    ...
    int Command = data[0];
    int Status = data[1];
    int Identifier = (data[2] << 24) 
                   | (data[3] << 16) 
                   | (data[4] << 8) 
                   | data[5];
    

    这会将标识符视为大端,但由于文档说 id 是不透明的,所以如果您在整个应用程序中将 id 视为大端,应该没问题。

    文档还提到了字节,而不是字符,所以也许你的变量都应该是无符号的?

    【讨论】:

    • 我试过了,看起来它可以正常工作。标识符 = (int)data[2] + ((int)data[3]
    • 您可以在这里用加法替换按位或|,但并非在所有情况下都相同。 (按位或就像没有进位的加法。)我更喜欢让我的表达式要么全部按位要么全部算术。移位的顺序决定了标识符。 id 是不透明的,因此它对客户端代码没有任何意义。选择一种表示并在您的代码中坚持使用它,即在写回时使用相同的字节顺序。
    • 也以简短的方式得到它:int Identifier = *(int *)&data[2];
    猜你喜欢
    • 2017-10-04
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-11
    • 1970-01-01
    相关资源
    最近更新 更多