Опять я в чайниках.. первые и последние 2 байта числа

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Опять я в чайниках.. первые и последние 2 байта числа

Сообщение Eugenio » 05.01.2005 (Ср) 11:08

Помогите с алгоритмом:
дано: нечто типа long.
нужно получить в виде отдельных чисел первые и последние 2 байта.
Не могу сообразить, как это проще всего сделать :?
Есть ли у меня вопрос? У меня всегда есть вопрос

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 05.01.2005 (Ср) 11:21

Код: Выделить всё
Option Explicit

'Простейшие функции для вычленения частей машинных сущностей :)

'(c) GSerg, 2004


'P.S. Через CopyMemory медленнее, через GetMem тоже :)


Public Function DWORD(ByVal Low As Integer, ByVal High As Integer) As Long
  If High And &H8000 Then
    DWORD = (High And &H7FFF) * &H10000 Or &H80000000 Or Low
  Else
    DWORD = High * &H10000 Or Low
  End If
End Function

Public Function WORD(ByVal Low As Byte, ByVal High As Byte) As Integer
  If High And &H80 Then
    WORD = (High And &H7F) * &H100 Or &H8000 Or Low
  Else
    WORD = High * &H100 Or Low
  End If
End Function

Public Function HIWORD(ByVal DblWord As Long) As Integer
  HIWORD = DblWord / &H10000
End Function

Public Function LOWORD(ByVal DblWord As Long) As Integer
  LOWORD = DblWord And &HFFFF&
End Function

Public Function HIBYTE(ByVal Wrd As Integer) As Byte
  If Wrd And &H8000 Then
    HIBYTE = (Wrd And &H7F00) / &H100 Or &H80
  Else
    HIBYTE = Wrd / &H100
  End If
End Function

Public Function LOBYTE(ByVal Wrd As Integer) As Byte
  LOBYTE = Wrd And &HFF
End Function
Последний раз редактировалось GSerg 10.01.2005 (Пн) 17:42, всего редактировалось 1 раз.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 05.01.2005 (Ср) 11:26

Вот это - работает всегда, без ограничений на значение 32-го бита.

Это - в модуль:
Код: Выделить всё
Public Type tag_4
  Four As Long
End Type

Public Type tag_2_2
  Lo As Integer
  Hi As Integer
End Type

Public Function SplitLong(ByVal L As Long) As tag_2_2
Dim Z As tag_4

Z.Four = L
LSet SplitLong = Z

End Function

Это - в код формы, на форме - один кнопка:
Код: Выделить всё
Private Sub Command1_Click()
Dim Z As Long, X As tag_2_2

Z = &H64583545
X = SplitLong(Z)

MsgBox "Low  = " & Hex(X.Lo) & vbNewLine & "High = " & Hex(X.Hi) & _
vbNewLine & "Number = " & Hex(Z)
End Sub

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 05.01.2005 (Ср) 11:28

Угу :)
Просто сей оператор отменили в .NET, поэтому, чтобы потом было меньше огорчений... :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 05.01.2005 (Ср) 11:39

GSerg писал(а):... Просто сей оператор отменили в .NET ...

Его не отменили, он остался, просто эта фишка с ним больше не работает :( Больше всего жалко было, если честно, все остальное еще как-то можно терпеть...

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 05.01.2005 (Ср) 12:01

Dim Z As tag_4

Z.Four = L
LSet SplitLong = Z

End Function

Хм, интересно. Никогда не пробовал копировать даные из одного типа в другой. Ух-х ты. Просто записывает байты в той же последовательности, в которой считывает? И в результате третий и четвертый оказываются в другом поле? ну, круто..
Последний раз редактировалось Eugenio 05.01.2005 (Ср) 12:09, всего редактировалось 1 раз.
Есть ли у меня вопрос? У меня всегда есть вопрос

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 05.01.2005 (Ср) 12:08

'Простейшие функции для вычленения частей машинных сущностей :)

Спасибо! Я то как раз собрался VarPtr и CopyMemory юзать. Но это как-то больше нравится
Есть ли у меня вопрос? У меня всегда есть вопрос


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 6

    TopList