2012-08-11 59 views
0

我正在读协议规范,它解释byte 0 : 0b0000001x if line Available. 所以,我必须根据此文档创建数据包,但我不知道如何分配0b0000001x到在C 可变我:无法找到数字文字运算符'运算符'“x0'

unsigned char * payload; 
payload[0] = 0b0000001x; 

,但我得到了以下错误:

error: unable to find numeric literal operator ‘operator"" x0’

+6

'0b0000001x'不是C.在你规范有效的数字表达它最有可能意思是“这是一个二进制数,即一系列比特”,而“x”是你应该根据当前状态设置或清除的位。如果我正确读取并且字节顺序正确,那么结果字节值应该是'(2 +(is_line_available?1:0))'。 (另外,你没有为'payload'分配任何空间,所以你会写入随机存储器中。) – DCoder 2012-08-11 14:29:22

+1

@DCoder:+1作为回答的帖子 – Aziz 2012-08-11 14:30:29

回答

4

根据您的规格,0b0000001x最有可能的意思是“这是一个二进制数,即比特序列”,并x是根据该行的当前状态,你应该设置位或清除。 Builtin binary literals are only supported in C++14 or above,在C++ 11中,它们可以作为用户定义的文字实现,在C和较旧版本的C++中,您需要手动计算该值(或者可以使用实现此功能的编译器作为非标准扩展) gcc和clang都这么做)。

如果我正确地读这篇文章,字节顺序是正确的,得到的字节值应为:

payload[0] = 2 + (is_line_available ? 1 : 0); 

而且,你是不是对​​分配任何空间,所以你会写进入随机记忆。您需要分配一些内存:

静态分配,工作在C和C++:

unsigned char payload[24]; // or whatever your message's length is 

C风格的动态分配(确保释放它大功告成后):

unsigned char *payload = malloc(24); 
...; 
free(payload); 

C++推荐的方法:

#include <vector> 
std::vector<unsigned char> payload; 
payload.reserve(24); 
...; 
+0

我不记得这是否仅在GCC中,或者如果这是标准中的新事物,但是https://gcc.gnu.org/onlinedocs/gcc/Binary-constants.html。 (该链接表示'i = 0b101010;'。) – 2016-06-20 13:37:39

+0

@LimitedAtonement:它可能早些时候是GCC扩展。它现在也是[C++ 14的一部分](https://en.wikipedia.org/wiki/C%2B%2B14#Binary_literals),我会尽快更新这个答案以反映这一点。 – DCoder 2016-06-20 15:06:34