Число в массив байт.

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

Число в массив байт.

Сообщение Kolobuk » 08.02.2007 (Чт) 21:36

Привет.

Есть:
Код: Выделить всё
Dim Massiv(3) As Byte


Есть:
Код: Выделить всё
Dim Chislo As Long


Как представить Chislo в виде Massiv(3)?

Т.е. как разбить 4-х байтное число на массив байт?

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 08.02.2007 (Чт) 21:50

And'ом

Например, Chislo And &HFF& - старший байт.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 08.02.2007 (Чт) 22:03

Kolobuk
Выделением каждого байта с помощью And либо CopyMemory
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Kolobuk
Обычный пользователь
Обычный пользователь
 
Сообщения: 61
Зарегистрирован: 24.10.2006 (Вт) 20:03

Сообщение Kolobuk » 08.02.2007 (Чт) 22:15

And'ом

Например, Chislo And &HFF& - старший байт.


Ух ты. Круто.

Спасибо.

---------
А два остальных байта как??? :?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.02.2007 (Чт) 22:23

BV писал(а):Например, Chislo And &HFF& - старший байт.

И как раз-таки младший.
Изображение

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 08.02.2007 (Чт) 23:12

Да, младший.
Старший так:

Chislo / &HFFFFFF& And &HFF&
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 08.02.2007 (Чт) 23:26

Но лучше все-таки CopyMemory или LSet.
Lasciate ogni speranza, voi ch'entrate.

Kolobuk
Обычный пользователь
Обычный пользователь
 
Сообщения: 61
Зарегистрирован: 24.10.2006 (Вт) 20:03

Сообщение Kolobuk » 08.02.2007 (Чт) 23:26

Старший и младший теперь понятны.

А 2 промежуточных? Ведь Лонг 4 байта занимает.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 09.02.2007 (Пт) 7:22

BV писал(а):Да, младший.
Старший так:

Chislo / &HFFFFFF& And &HFF&

Срабатывает только за счёт округления.
А должно быть Chislo \ &H1000000 And &HFF
Изображение

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 09.02.2007 (Пт) 18:52

В общем, так. Дело было вечером...

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

Private Declare Sub RtlMoveMemory Lib "kernel32.dll" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)

Private Type Int32_2
    LWord As Integer 'Младшее слово
    HWord As Integer 'Старшее слово
End Type

Private Type Int32_4
    LByte1 As Byte 'Младший байт
    LByte2 As Byte
    HByte2 As Byte
    HByte1 As Byte 'Старший байт
End Type

Dim int32Number2 As Int32_2
Dim int32Number4 As Int32_4

Dim lNumber As Long

Private Sub cmdBegin_Click()
    With int32Number2
        .LWord = -15846
        .HWord = 24791
    End With
    Call RtlMoveMemory(lNumber, int32Number2, 4)
   
    Dim intWord As Integer
    Dim bByte As Byte
   
    Me.CurrentX = 10 * Screen.TwipsPerPixelX
    Me.CurrentY = 10 * Screen.TwipsPerPixelX
    Me.Print "Результат разложения lNumber на 2 слова (Word):" & vbCrLf
   
    Me.CurrentX = 20 * Screen.TwipsPerPixelX
    Call RtlMoveMemory(intWord, lNumber, 2)
    Me.Print "LoWord: " & Str$(intWord)
    Me.CurrentX = 20 * Screen.TwipsPerPixelX
    Call RtlMoveMemory(intWord, ByVal VarPtr(lNumber) + 2&, 2)
    Me.Print "HiWord: " & Str$(intWord)
   
    With int32Number4
        .LByte1 = 165
        .LByte2 = 49
        .HByte2 = 237
        .HByte1 = 198
    End With
    Call RtlMoveMemory(lNumber, int32Number4, 4)
   
    Me.Print
    Me.CurrentX = 10 * Screen.TwipsPerPixelX
    Me.Print "Результат разложения lNumber на 4 байта:" & vbCrLf
   
    Me.CurrentX = 20 * Screen.TwipsPerPixelX
    Call RtlMoveMemory(bByte, lNumber, 1)
    Me.Print "LoByte1: " & Str$(bByte)

    Me.CurrentX = 20 * Screen.TwipsPerPixelX
    Call RtlMoveMemory(bByte, ByVal VarPtr(lNumber) + 1&, 1)
    Me.Print "LoByte2: " & Str$(bByte)
   
    Me.CurrentX = 20 * Screen.TwipsPerPixelX
    Call RtlMoveMemory(bByte, ByVal VarPtr(lNumber) + 2&, 1)
    Me.Print "HiByte2: " & Str$(bByte)

    Me.CurrentX = 20 * Screen.TwipsPerPixelX
    Call RtlMoveMemory(bByte, ByVal VarPtr(lNumber) + 3&, 1)
    Me.Print "HiByte1: " & Str$(bByte)

End Sub


Если у кого есть желание сделать этот же пример через And -- милости прошу :)
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 09.02.2007 (Пт) 19:24

Эмм, GSerg выкладывал класс для битовых операций то ли в кирпичах то ли в популярных вопросах. В том числе там было и все нужное автору
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 09.02.2007 (Пт) 21:28

Ведь alibek давно ответ дал - трудно попробовать?

Код: Выделить всё
Private Type tb
    b1 As Byte
    b2 As Byte
    b3 As Byte
    b4 As Byte
End Type

Private Type ta
    a(3) As Byte
End Type

Private Type ti
    i As Long
End Type

Public Sub Main()
    Dim ii As ti, bb As tb, aa As ta

    Debug.Print "---"

    ii.i = 1025
    LSet bb = ii
   
    Debug.Print "1:", ii.i, bb.b4, bb.b3, bb.b2, bb.b1
   
    LSet aa = ii

    Debug.Print "2:", ii.i, aa.a(3), aa.a(2), aa.a(1), aa.a(0)
    Debug.Print "==="
End Sub


Что еще надо для счастья?
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

EUGY
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 214
Зарегистрирован: 09.11.2006 (Чт) 22:51
Откуда: Мурманск

Сообщение EUGY » 10.02.2007 (Сб) 6:08

' Почти в тему

Dim e(2) As Byte
Dim l As Long

l = RGB(255, 100, 200)

Call CopyMemory(e(0), l, 3)


Debug.Print e(0) & " R-value"
Debug.Print e(1) & " G-value"
Debug.Print e(2) & " B-value"


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

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

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

    TopList  
cron