2012-12-02 124 views
4

我有一個8位的字符串,我想將它轉換爲1個字節。我不知道爲什麼我的功能無法正常工作。我有8位存儲到8個無符號字符的數組中。這是我到目前爲止的方法:從8位轉換爲1個字節

unsigned int bitsToBytes(unsigned char *bits) 
{ 
    unsigned int sum = 0; 
    for(int i = 7; i >= 0; i--) 
    { 
    sum += bits[i]; 
    sum<<=1; 
    } 
    return sum; 

} 

int main() 
{ 
    unsigned char bits[8]; 
    unsigned int byt; 
    byt = bitsToBytes(bits); 
    cout << byt; //doesn't give me the right result 
} 

編輯:我的數組數組中包含'1'和'0'的數組!對不起,不清楚。

可能有人知道我在哪裏出錯了?我不知道爲什麼我的位不正確轉換爲字節。誰能幫忙?謝謝!

+2

在你的榜樣,你是不是把任何東西放入'bits'。 –

+1

你期待什麼結果?由於您未初始化「位」,因此您不應該對所顯示的代碼的輸出有任何期望。 – bames53

+3

另請注意,您需要在添加該位之前進行移位。 –

回答

5
sum += bits[i]; 

如果你想轉換一個C 字符串(例如,"1010101"),該代碼將codetable值(ASCII,UTF-8,無論你的編碼有)的字符(例如,48和49),而不是10。你也應該改寫這個作爲

sum += bits[i] - '0'; 

,你不初始化bits陣列 - 之前未定義的行爲初始化結果使用其內容,所以你可以expact 什麼發生。

此外,您的代碼邏輯有缺陷 - 一,您必須在之前執行左移添加二進制數字。二,你正在向後穿過琴絃;行

for (int i = 7; i >= 0; i--) 

確實應該

for (int i = 0; i < 8; i++) 
+0

@ bames53的權利,將更新。 – 2012-12-02 08:54:20

+0

^^這是我的困惑,當我發佈我的答案... – anishsane

+0

啊,這很有幫助!但是,我仍然在打印錯誤的值......但我不確定爲什麼不幸。例如:我有我的無符號字符位= 10100101這應該給我一個十進制值165。但是,當我打印byt時,我得到330.另外,當我把東西像00110000這應該給我一個十進制值30,我得到24.任何想法? – user200081

1

這應該正常工作,正常情況下。

char []包含什麼?它是否包含'0','1'而不是0,1?

要確保,變線

sum += bits[i]; 

sum |= bits[i] & 1; 

此外,在意見中指出沃恩卡託,你需要加入之前被移位

+1

這分別依賴於'0'和'1'的字符代碼是偶數和奇數(如果假設爲ASCII,則只能偶然使用)。 – 2012-12-02 08:52:20

+0

是的,我假定C/cpp ascii ...由於問題被標記爲C++&它是簡單的字符,而不是wchar_t。另一個選擇是減去'0',但我不確定,如果他的數組包含1或'1';我的意思是,這是否是他的案子中的真正問題。 – anishsane

+0

我的數組包含'1'和'0',所以很抱歉讓您困惑! – user200081

0

如果任何人仍然有興趣將位轉換爲字節檢查此要點。我準備將它作爲Arduino的草圖,以便我可以發送代表每個字節的電子脈衝。我使用int數組而不是字符,但概念是相同的。考慮到這些類型的大小,我可能很快將其切換爲字節或字符。

特別看看在encodeByte和decodeByte功能

素描傳輸比特gist