繁体   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