2017-09-01 80 views
4

影響我知道這可能是一個愚蠢的問題,但我是一個新手,C++開發人員,我需要對字節序一些澄清。字節序的C++代碼

我要實現依賴於SCTP協議,以便兩個不同的機器(基於一個ARM,和基於其他英特爾)之間進行通信的通信接口。

目的是:

  1. 編碼消息轉換成字節流要在套接字上發送(I使用uint8_t的載體,並且被定位-taking護理分裂UINT16的不同字段的每個字節/ 32/64到單個字節 - 遵循big-endian約定)
  2. 通過套接字發送字節流給接收方(使用stcp)
  3. 檢索流並解析它以便用正確的元素填充消息對象由標題+電視信息元素表示)

我在哪裏可以有問題,在接口將要使用的2臺機器的底層架構的字節順序混亂。 我認爲照顧將對象拆分爲單個字節並使用big-endian進行定位可能會阻止在到達時流的表示方式不同,對吧?或者我錯過了什麼?

另外,我在懷疑多字節變量的C++表示的角色,例如:

uint16_t var=0x0123; 

//low byte 0x23 
uint8_t low = (uint8_t)var; 

//hi byte 0x01 
uint8_t hi = (uint8_t)(var >> 8); 

這段代碼是依賴字節順序或不?即如果我工作在一個big-endian機器上,我認爲上面的代碼是可以的,但是如果它是little-endian,我會按不同的順序來獲取這些字節嗎?

我搜索已經爲這樣的問題,但沒人給我一個明確答覆,所以我仍然懷疑這一點。

先謝謝大家,祝你有個美好的一天!

+0

'reinterpret_cast (&var)[0]'將根據字節順序而不同。 – Jarod42

+1

您可以'reinterpret_cast var'來避免冗長而混亂的語法。 – patatahooligan

+0

現在我想起來了,'uint8_t'不一定是'unsigned char'的typedef,所以將'uint16_t'的一部分重新解釋爲'uint8_t'實際上是未定義的。 – patatahooligan

回答

6

這段代碼是依賴字節順序或不?

否代碼不依賴於目標機器的字節順序。按位操作的工作方式與例如數學運算符呢。

它們獨立於數字的內部表示。


但如果你更換了電線的數據,你需要有在雙方已知的定義字節順序。通常這是網絡字節順序(即大端)。

htonx()ntohx()家庭的功能會幫你做加密/正確,透明地解碼(多字節)的數字。

+1

好的,謝謝。流部分呢?事實上,我手動將單個字節以big-endian格式放置,然後通過套接字發送它們,檢索並解碼,知道這是大endian順序應該會好起來的,對吧? –

+1

@panc_fab關於這一點,我延伸了我的答案。 – user0042

+0

抱歉,我在發佈評論後纔看到您的修改:)謝謝,我一定會檢查這些方法! –

2

您提供的代碼是endian無關的,並且可能是您的使用案例的正確方法。

什麼都不行,而且不便於攜帶,是代碼依賴於對象的內存佈局:

// Don't do this! 
uint16_t var=0x0123; 
auto p = reinterpret_cast<char*>(&var); 
uint8_t hi = p[0]; // 0x01 or 0x23 (probably!) 
uint8_t lo = p[1]; // 0x23 or 0x01 (probably!) 

(我的意見書面可能表明,這些都是可能的實際值,而不是標準C++指定的任何值)