2010-09-28 136 views
9

我需要將二進制補碼格式的字節轉換爲正整數字節。 範圍-128到127映射到0至255二進制補碼轉換

Examples: -128 (10000000) -> 0 , 127 (01111111) -> 255, etc. 

EDIT要清理的混亂,輸入字節是(當然)範圍爲0到255的無符號整數,但它代表使用二進制補碼格式的-128至127範圍內的有符號整數。例如,128(二進制10000000)的輸入字節值實際上表示-128。

EXTRA EDIT Alrighty,可以說我們有以下字節流0,255,254,1,127。在二進制補碼格式中,這代表0,-1,-2,1,127.這個我需要鉗位到0到25​​5的範圍。欲瞭解更多信息請查看這個很難找到文章:Two's complement

+2

'byte'沒有簽名,你想幹什麼? – leppie 2010-09-28 12:12:01

+0

我仍然不完全確定在這裏嘗試了什麼。要麼是所有答案給你的方式,要麼你錯誤地理解2的補碼錶示。 – leppie 2010-09-28 12:29:33

回答

7

從你的樣品輸入您只是想:

sbyte something = -128; 

byte foo = (byte)(something + 128); 
+0

請參閱我的編輯。現在希望它更清楚。 – Yehonatan 2010-09-30 06:32:01

+3

@Yehonatan:但是您想如何在0到255範圍內表示-1? – leppie 2010-09-30 07:04:56

0

你可以描述爲增加偏置到你的電話號碼一樣簡單的東西(在這種情況下,將128添加到簽名號碼)。

+0

如果只是這麼簡單。 – Yehonatan 2010-09-30 06:32:32

6
new = old + 128; 

賓果:-)

+9

因爲我找不到'bingo'關鍵字,所以我編輯了你的答案以便閱讀:-) – paxdiablo 2010-09-28 12:33:47

+0

'舊'是原始字節值還是它的轉換?如果它的原始字節值,那麼這給出了錯誤的答案。如果它是後者,那麼這就是我要求的過程。 – Yehonatan 2010-09-30 06:30:56

0

如果我正確undestood,你的問題是如何輸入,這實在是一個signed-bytesbyte)轉換,但輸入存儲在unsigned integer,然後還通過將它們轉換爲零來避免負值。

需要明確的是,當你使用一個符號的類型(如ubyte)的框架是用Two's complement幕後,所以才鑄造了你將要使用補正確的類型。

然後,一旦完成了該轉換,可以用簡單的if或條件三元運算符(?:)來限制負值。

下面提出將返回0爲值from 128 to 255(或從-128至-1)the same value爲值from 0 to 127的功能,和。

所以,如果你必須使用無符號整數作爲輸入和輸出,你可以使用這樣的事情:

private static uint ConvertSByteToByte(uint input) 
{ 
    sbyte properDataType = (sbyte)input; //128..255 will be taken as -128..-1 
    if (properDataType < 0) { return 0; } //when negative just return 0 
    if (input > 255) { return 0; } //just in case as uint can be greater than 255 
    return input; 
} 

或者,恕我直言,你可以在你的輸入和輸出更改爲數據類型最適合您的輸入和輸出(sbyte而字節):

private static byte ConvertSByteToByte(sbyte input) 
{ 
    return input < 0 ? (byte)0 : (byte)input; 
} 
2

嘗試

sbyte signed = (sbyte)input; 

int signed = input | 0xFFFFFF00; 
1
public static byte MakeHexSigned(byte value) 
    { 
     if (value > 255/2) 
     { 
      value = -1 * (255 + 1) + value; 
     } 

     return value; 
    } 
1
int8_t indata; /* -128,-127,...-1,0,1,...127 */ 
uint8_t byte = indata^0x80; 

XOR MSB,這是所有

+2

對我來說,這看起來不像C# – reggaeguitar 2015-04-01 19:27:47

0

我相信,二進制補碼的字節將與下文中最好的做法。也許不優雅或短暫,但清晰明顯。我會把它作爲我的一個util類中的靜態方法。

public static sbyte ConvertTo2Complement(byte b) 
{ 
    if(b < 128) 
    { 
     return Convert.ToSByte(b); 
    } 
    else 
    { 
     int x = Convert.ToInt32(b); 
     return Convert.ToSByte(x - 256); 
    } 
} 
1

這是我對這個問題的解決方案,對於大於8位的數字。我的例子是一個16位的值。注意:您必須檢查第一位,以確定它是否爲負值。

步驟:

  1. 轉換#由變量之前放置 '〜' 讚揚。 (即,Y =〜Y)

  2. 轉換#分別爲二進制串

  3. 歇二進制串入字符數組

  4. 與最右邊的值開始,加1,跟蹤攜帶的。將結果存儲在字符數組中。

  5. 將字符數組轉換回字符串。

    private string TwosComplimentMath(string value1, string value2) 
    { 
        char[] binary1 = value1.ToCharArray(); 
        char[] binary2 = value2.ToCharArray(); 
        bool carry = false; 
        char[] calcResult = new char[16]; 
    
        for (int i = 15; i >= 0; i--) 
        { 
         if (binary1[i] == binary2[i]) 
         { 
          if (binary1[i] == '1') 
          { 
           if (carry) 
           { 
            calcResult[i] = '1'; 
            carry = true; 
           } 
           else 
           { 
            calcResult[i] = '0'; 
            carry = true; 
           } 
          } 
          else 
          { 
           if (carry) 
           { 
            calcResult[i] = '1'; 
            carry = false; 
           } 
           else 
           { 
            calcResult[i] = '0'; 
            carry = false; 
           } 
          } 
         } 
         else 
         { 
          if (carry) 
          { 
           calcResult[i] = '0'; 
           carry = true; 
          } 
          else 
          { 
           calcResult[i] = '1'; 
           carry = false; 
          } 
         } 
    
        } 
    
        string result = new string(calcResult); 
        return result; 
    
    }