немного упаковать Int16 в Ushort VB.net - PullRequest
0 голосов
/ 22 октября 2009

Я должен упаковать и распаковать 16-битный Int из / в Ushort в VB.net

Вот как я думал, что смогу это сделать (не работает, дает исключение переполнения)

'Pack Int16 into ushort '
Dim usPacked = CType(Data, UShort)

'unpack Int16 from ushort '
Dim unpacked = CType(data,Int16)

Спасибо!

Ответы [ 2 ]

1 голос
/ 23 октября 2009

Вы можете использовать старое решение Union

<StructLayout(Runtime.InteropServices.LayoutKind.Explicit)> _
Structure s1
    <FieldOffset(0)> Public AsShort As Short
    <FieldOffset(0)> Public AsUShort As UShort
End Structure

Dim v1 = GetTheShortValue()   
Dim v2 = new s1
v2.AsShort = v1
Dim v3 As UShort = v2.AsUShort
0 голосов
/ 23 октября 2009

РЕДАКТИРОВАТЬ: Ответ Джареда лучше, чем этот мой :(

  • UShort может хранить целые числа от 0 до 65 535.
  • Short может хранить целые числа от -32 768 до 32 767.
  • Long может хранить целые числа от -2 млрд до +2 млрд.

Вы получите переполнение , если попытаетесь поместить отрицательные числа в короткую строку США или попытаться поместить числа более 32 767 в короткую позицию. Одним из решений является использование Long в качестве посредника.

  'Pack Int16 into ushort '  
  Dim usPacked = CType(CLng(nData) + 32768, UShort)    
  'unpack Int16 from ushort '  
  Dim unpacked = CType(CLng(usPacked) - 32768, Int16)
...