2013-03-01 566 views
1

我相信這是一個非常簡單的答案,但我無法弄清楚。 我已經呈現在UInt32格式的價值,雖然它的最大將是65535 據reqiured將其轉換爲Int16格式顯示的目的,因此顯示的範圍爲-32768至32767如何將0-65535轉換爲Int16等效值-32768-32767?

簡單Convert.ToInt16(65535)拋出一個例外,65535對於Int16來說太大或太小。

是否有一個內置的函數來處理這個問題,或者有人能指出我的解決方案嗎?

編輯:再次編輯後發表進一步討論 - 65535不是範圍轉移它實際上是-32768,所以我想要做一個從UInt32 65535轉換爲Int16 -32768。 感謝您迄今爲止的所有答案。

+0

是否要更改類型而不更改字節? 'Int16'代表'65535',因此轉換失敗。如果你解釋爲什麼你想要這個,我們可能會幫助更多。 – Jodrell 2013-03-01 08:57:43

+0

顯然65535對int16來說太大了。你想要輸出什麼? – 2013-03-01 08:59:20

+0

您標記的答案與您的問題中的編輯不符。這使得這頗具誤導性。請更改編輯或標記準確的答案。 – Jodrell 2013-03-01 10:40:52

回答

4

這取決於您確切需要的內容。您可以使用:

int i = 65535; 
Int16 x = (Int16) i; 

這映射65535 -1,65534 -2等

但是如果你想改變你的範圍0-65535 -32768 - +32767那麼你可以使用

int yourvalue = 65535; // value between 0...65535 
int i = yourvalue - 32768; 
Int16 x = (Int16) i; 
+0

+1哦,酷我沒有意識到在C#中的直接演員將重新解釋位:) – Goz 2013-03-01 09:15:28

+0

和'65536' - >'0'和'65537' - >'1'這很好。 – Jodrell 2013-03-01 09:21:41

+0

這就是我正在尋找的東西。非常感謝這和所有的建議。 – Tony 2013-03-01 10:04:10

4

也許我錯過了一些東西,但你能不能只是做這樣的事情?

UInt32 val = 65535; 
Int16 result = (Int16)(val - 32768) 
+0

不應該是一個Int32不是UInt32 ... – Goz 2013-03-01 09:00:30

+1

在OP中,它表示該值是一個UInt32 – Steve 2013-03-01 09:02:29

+0

但是這樣做的意義何在? – Jodrell 2013-03-01 09:03:11

1

沒有什麼內置的,所以你需要自己寫。下面是一個擴展方法來做到這一點:

public static short ConvertToInt16(this uint source) 
{ 
    return (short)(source - 32768); 
} 

並且對方:

public static uint ConvertToUInt32(this short source) 
{ 
    return (ushort)(source + 32768); 
} 
+1

,但一個ushort不能是負面的... – Goz 2013-03-01 09:00:00

-1
UInt32 source = ... 

Int16 result = (Int16) (source > 32767 ? source - 65536 : source); 
+0

你的答案似乎無效。作者希望'0'映射到-32768。你的答案地圖0,1,2,3,...到0,1,2,3,..請仔細閱讀 – quetzalcoatl 2013-03-01 09:22:13

+0

@quetzalcoatl,我不知道你從哪裏得到了這個想法 - 從「I '想要從UInt32 65535轉換爲Int16 -32768「。 – Joe 2013-03-01 09:58:58

+0

WTF! 1小時前,我清楚地看到,在原始文章中有一些像「UInt 65535應該被轉移到32767,並且UInt 0到Int16 -32768。」。它在帖子底部的「編輯」部分。現在我讀了這篇文章,還有一些完全不同的東西。海報必須改變這一點。請用一些空格編輯您的文章,以便我可以刪除-1(由於時間限制現在已被鎖定) – quetzalcoatl 2013-03-01 10:36:55

0

如果你不想在你的代碼中使用了太多神奇的數字,你可以只轉移範圍內添加Int16.MinValue

short displayValue = (short)(value + Int16.MinValue); 

請注意,如果您的源值不適合你秒的範圍內,這將溢出pecified。所以,如果你想檢查溢出,你可以把它包裝成一個checked表達(會拋出溢出異常),或使用Math.Min執行的65535上限:

short displayValue = (short)(Math.Min(value, UInt16.MaxValue) + Int16.MinValue); 
3

假設你想重新 - 將位解釋爲int16(即65535 - > -1)

UInt32 x = 65536; 
Int16 y = BitConverter.ToInt16(BitConverter.GetBytes(x), 0); 
+0

和'65536' - >'0'和'65537' - >'1'這很好。 – Jodrell 2013-03-01 09:16:52

+0

@Jodrell:假設你想要什麼;) – Goz 2013-03-01 09:19:55

0

您的編輯後,我覺得你所要求的財產以後像

static Int16 Convertor(UInt32 val) 
{ 
    if (val > Int16.MaxValue) 
    { 
     var h = (val - Int16.MaxValue) * -1; 
     if (h < Int16.MinValue) 
     { 
      throw new OverflowException(); 
     } 

     return (Int16)h; 
    } 

    return (Int16)val; 
} 

如果比較byte佈局Int16-32768UInt3265535帶着幾分類似的代碼

var b = BitConvertor.GetBytes(val); 
Console.Write('[') 
for (var i = 0; i < b.Length - 1; i++) 
{ 
    Console.Write(b[i]); 
    Console.Write(", "); 
} 

Console.Write(b[b.Length - 1]); 
Console.WriteLine(']'); 

你會得到輸出如下

[0,128] //爲Int16-32768

[255,255,0,0] //對於UInt3265535

我沒有看到任何簡單的字節明智的轉換給你想要的結果。