2012-08-11 267 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