2013-03-01 144 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

我没有看到任何简单的字节明智的转换给你想要的结果。

相关问题