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

Вы хотите изменить тип без изменения байтов? Нет эквивалента '65535', представленного' Int16', следовательно, сбой преобразования. Если вы объясните, почему вы этого хотите, мы можем помочь больше. – Jodrell

+0

Очевидно, что 65535 слишком велико для int16. Что вы хотите, чтобы выход был? – 2013-03-01 08:59:20

+0

Ответ, который вы отметили, не соответствует редактированию в вашем вопросе. Это делает это довольно вводящим в заблуждение. Измените изменение или отметьте точный ответ. – Jodrell

ответ

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

+0

и '65536' ->' 0' и '65537' - > '1', что приятно. – Jodrell

+0

Это именно то, что я искал. Большое спасибо за это и за все предложения. – Tony

4

Возможно, мне что-то не хватает, но не можете ли вы просто сделать что-то подобное?

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

Не должно быть Int32 не UInt32 ... – Goz

+1

В OP это говорит, что значение является UInt32 – Steve

+0

Но в чем смысл этого? – Jodrell

1

Ничего не создано, поэтому вам нужно написать свой собственный. Вот метод расширения, чтобы сделать это:

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

И наоборот:

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

, но ухорт не может быть отрицательным ... – Goz

-1
UInt32 source = ... 

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

Ваш ответ кажется недействительным. Автор хочет, чтобы «0» отображалось на -32768. Ваш ответ отображает 0,1,2,3, ... до 0,1,2,3, .. Пожалуйста, внимательно прочитайте – quetzalcoatl

+0

@quetzalcoatl, я не знаю, откуда у вас эта идея, - от вопроса «Я «Мне нужно преобразование из UInt32 65535 в Int16 -32768». – Joe

+0

WTF! То, что 1 час назад я ясно видел, что в исходном посте было что-то вроде «UInt 65535 следует переместить на 32767, а UInt 0 - на Int16 -32768». Это было в разделе «EDIT» внизу сообщения. Теперь я прочитал сообщение, и есть что-то совершенно другое. Плакат, должно быть, изменил это. Пожалуйста, отредактируйте свой пост с некоторыми пробелами, поэтому я могу удалить -1 (который теперь заблокирован из-за ограничения по времени) – quetzalcoatl

0

Если вы не хотите использовать слишком много магических чисел в коде, вы можете просто сместить диапазон путем добавления Int16.MinValue:

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

Обратите внимание, что это будет переполнение, если ваше исходное значение не укладывается в диапазон вы S pecified. Итак, если вы хотите, чтобы проверить это переполнение вы можете обернуть его в выражение checked (который бросает исключение на переполнение), или использовать Math.Min для обеспечения верхнего предела 65535:

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

Предполагая, что вы хотите повторно -interpret биты как int16 (т.е. 65535 -> -1)

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

и '65536' ->' 0' и '65537' ->' 1', что приятно. – Jodrell

+0

@Jodrell: Предполагая, что вы хотите все равно;) – Goz

0

После правки я думаю, что вы просите Somthing как

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-32768 и UInt3265535 с небольшим количеством кода, как

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

Я не вижу простого преобразования по байт-мудре, чтобы дать желаемый результат.

Смежные вопросы