[英]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.