簡體   English   中英

將short []轉換為ushort []

[英]convert short[] to ushort[]

我需要在C#中將short []轉換為ushort []

public ushort[] Pixels16bits;

 GrayscalePixelDataS16 Pixeldata = PixelDataFactory.Create(img.PixelData, 0) as GrayscalePixelDataS16; //Pixeldata has short[] values

Pixels16bits = pixeldata; //Here's where I struggle, I need to convert to ushort prior to assign to pixels16bits

謝謝

我看到幾個選擇:

img.PixelData.Cast<ushort>().ToArray();

也許:

img.PixelData.Select(Convert.ToUInt16).ToArray();

兩者都利用LINQ將轉換功能應用於集合的能力。

作為常規解決方案,我建議:

unsigned = ConvertAll(signed, i => (ushort)i)

與LINQ解決方案相比,這產生的垃圾更少,並且同樣簡潔明了。

一個好的老式循環也是一個考慮因素,因為它允許您轉換為現有數組,而不是分配新數組。

作為值轉換功能,您可以使用:

  • C樣式強制轉換i => (ushort)i ,默認情況下它不會抱怨整數溢出(您可以在編譯器設置中進行更改)

    確切地說,您可以根據所需的行為編寫i => unchecked((ushort)i)i => checked((ushort)i)

  • 不管編譯器設置如何,如果輸入大於short.MaxValue ,則Convert.ToInt16會引發OverflowException

有一個有趣的/惡作劇的技巧,可讓您將short[]視為ushort[]而無需實際轉換:

short[] signed = new short[]{-1};
signed.GetType().Dump();// short[]

ushort[] unsigned = (ushort[])(object)signed;

unsigned.GetType().Dump();// still short[]
unsigned[0].Dump(); // 65535

它編譯並且不會引發運行時錯誤。

CLR規范說ushort[]short[]是兼容的,因為將short轉換為ushort保留表示形式。 這是與數組協方差相似的機制。

另一方面,C#規范不允許這種轉換。 這就是為什么必須將object中間轉換的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM