Преобразование

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Преобразование

Сообщение Ruslan Demidow » 28.12.2005 (Ср) 13:09

Есть определённое число (беззнаковое в С++). В памяти занимает 4 байта. Оно преобразовывается к Hex-виду (Hex$(Число)). Теперь вопрос. По идее обратно получить число в обычном десятичном виде можно через Val("&H"+"Число в Hex-виде"). Но есть некоторые числа, которые получаются отрицательными. Но результирующее число не должно быть отрицательным. Отрицательное число в результате вычисления говорит только о том, что результат получен неверный.
Как мне получить нормальное беззнаковое число (положительное) из Hex-вида в Long-виде?
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

GAGArin
Неистовый флудер
Неистовый флудер
 
Сообщения: 1777
Зарегистрирован: 23.12.2002 (Пн) 12:46
Откуда: я тут взялся, не знаю...

Сообщение GAGArin » 28.12.2005 (Ср) 13:55

Дай примеры.

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

Сообщение GSerg » 28.12.2005 (Ср) 14:06

Отрицательное правильно.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение Andrey Fedorov » 28.12.2005 (Ср) 14:08

В Long не выйдет по определению ибо Long это 4-ре байта у которых один бит ушел на знак.

Можно преобразовывать в Currency

Код: Выделить всё
Public Function ACCur(ByVal Value As Currency) As Currency
    Dim c As Currency
    c = CCur(Value)
    If c < 0 Then
        ACCur = 4294967296# + c
    Else
        ACCur = c
    End If
End Function


?ACCur(&H7FFFFFFF)
2147483647
?ACCur(&H80000000)
2147483648
?ACCur(&HFFFFFFFF)
4294967295
Последний раз редактировалось Andrey Fedorov 28.12.2005 (Ср) 14:23, всего редактировалось 1 раз.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 28.12.2005 (Ср) 14:17

GSerg
Т.е. например число e13b9b44 будет в результате преобразования иметь вид -516187324 - и это будет правильным результатом?
Как же мне получить беззнаковое число (как в С++) из e13b9b44.

Это используется для определения количества секунд прошедших с 01.01.1970 00:00:00.
Т.е. получаем в Long число секунд прошедших с 01.01.1970 00:00:00, преобразовываем его в Hex-вид и вставляем в служебные поля сообщения. Таким образом число в Hex-виде является как бы идентификатором сообщения. Если в другое сообщение является ответом на первое сообщения, то тогда в ответе (тоже в служебных полях) указывается идентификатор сообщения на которое отвечаем. Таким образом мы имеем возможность построить цепочки ответов.
Вся закавыка в том, что заголовок каждого сообщения имеет в своей структуре поля MsgID и ReplyID. И эти поля содержат числа типа Long. В первом соответственно количество секунд прошедших с 01.01.1970 на момент создания сообщения, во втором количество секунд прошедших с 01.01.1970 на момент написания письма на которое отвечаем. Но в текстах соощений ответов есть ReplyID (идентификатор письма на которое отвечаем) только в Hex-виде. И для нормальной работы нужно эти значения преобразовывать туда-сюда.
Вот... Сумбурно, правда написал, но всё же... На дополнительные вопросы отвечу с удовольствием.
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 28.12.2005 (Ср) 14:23

Andrey Fedorov правильно говорит. Long в VB (4 байта) это не беззнаковое целое в сях (4 байта). 1 бит так или иначе будет идти на знак. Используй другой тип данных.
То, что для одних константа, для других только переменная...

GAGArin
Неистовый флудер
Неистовый флудер
 
Сообщения: 1777
Зарегистрирован: 23.12.2002 (Пн) 12:46
Откуда: я тут взялся, не знаю...

Сообщение GAGArin » 28.12.2005 (Ср) 14:27

Я правильно понимаю что тебе из e13b9b44 надо получить 3778779972?

ADD: Если да, то тебе Andrey Fedorov уже написал решение. В Long ты просто не всегда влезешь.

Блин пока правил еще три ответа накатали ))
Последний раз редактировалось GAGArin 28.12.2005 (Ср) 14:32, всего редактировалось 2 раз(а).

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

Сообщение Andrey Fedorov » 28.12.2005 (Ср) 14:27

Ruslan Demidow писал(а):Это используется для определения количества секунд прошедших с 01.01.1970 00:00:00.


?DateDiff("s",#1/1/1970#,Date)
Последний раз редактировалось Andrey Fedorov 28.12.2005 (Ср) 15:00, всего редактировалось 3 раз(а).
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

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

Сообщение alibek » 28.12.2005 (Ср) 14:29

Ruslan Demidow писал(а):Т.е. например число e13b9b44 будет в результате преобразования иметь вид -516187324 - и это будет правильным результатом?
Как же мне получить беззнаковое число (как в С++) из e13b9b44.

Пиши ?9Val("&h" & e13b9b44 )+2147483648@)
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение Andrey Fedorov » 28.12.2005 (Ср) 14:30

GAGArin писал(а):Я правильно понимаю что тебе из e13b9b44 надо получить 3778779972?


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

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

Сообщение GSerg » 28.12.2005 (Ср) 14:31

Ruslan Demidow писал(а):Т.е. например число e13b9b44 будет в результате преобразования иметь вид -516187324 - и это будет правильным результатом?

Да.

Ruslan Demidow писал(а):Как же мне получить беззнаковое число (как в С++) из e13b9b44.

Это и есть e13b9b44.
Только на экран выведено как -516187324. От того, что его вывели на экран как -516187324, оно не перестаёт быть e13b9b44.

Ruslan Demidow писал(а):Вот... Сумбурно, правда написал, но всё же... На дополнительные вопросы отвечу с удовольствием.

Нет, почему же, всё понятно.
Классическое непонимание разницы между данными и строковым представлением данных.

Тебе вообще не нужно никакое преобразование ниоткуда никуда.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 28.12.2005 (Ср) 14:59

GSerg писал(а):
Ruslan Demidow писал(а):Вот... Сумбурно, правда написал, но всё же... На дополнительные вопросы отвечу с удовольствием.

Нет, почему же, всё понятно.
Классическое непонимание разницы между данными и строковым представлением данных.

Тебе вообще не нужно никакое преобразование ниоткуда никуда.

И всё-таки преобразование нужно - поле в структуре имеет тип Long. Значение я имею только в виде строки. Как запихать строку в Long. Тут по всякому напорешься на 13-ую ошибку без преобразования. А преобразовать нужно в Long.

Сейчас буду пробовать через Currency.
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

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

Сообщение alibek » 28.12.2005 (Ср) 15:03

Тогда преобразуй строку в Hex-представление и присваивай Value = Val("&h" & ...)
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение Andrey Fedorov » 28.12.2005 (Ср) 15:07

Ruslan Demidow писал(а):И всё-таки преобразование нужно - поле в структуре имеет тип Long. Значение я имею только в виде строки. Как запихать строку в Long. Тут по всякому напорешься на 13-ую ошибку без преобразования. А преобразовать нужно в Long.


То есть якобы тебе нужно в беззнаковый Long преобразовать?
Для передачи API-шке?

Тогда надо смотреть то что GSerg говорил - он прав.

?CLng(&H7FFFFFFF)
2147483647
?CLng(&H80000000)
-2147483648
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 28.12.2005 (Ср) 16:02

Для примера.
Есть струкура заголовка письма:
Код: Выделить всё

Public Type SabjRecord
    Name As String * 72 'Поле "Тема" заголовка письма
    DateTime As String * 20 'Дата и время создания письма в виде символьной строки в формате, принятом в сети FidoNet
    ToName As String * 36 'Поле "Кому" заголовка письма
    FromName As String * 36 'Поле "От кого" заголовка письма
    StrucLen As Long 'Размер структуры файла заголовков и должен быть равен 238
    Status As Long ' Статус письма (см. константы статуса письма)
    MailID As Long ' Идентификатор письма, используемый тоссером
    ReciptTime As Long 'Дата и время тоссинга
    offset As Long 'Смещение  первого символа текста сообщения (кладж MagicID) в файле базы писем
    TextLen As Long 'Длина текста сообщения в файле базы писем (включая все кладжи)
    Index As Long 'Порядковый номер этого сообщения в базе писем (0, 1, 2 и т. д.)
    Filler As Integer 'Пустое поле
    Attrib As Integer 'Атрибуты письма (см. константы атрибутов письма)
    Cost As Integer 'Пустое поле
    OrigZone As Integer 'Номер зоны отправителя (обычно 2)
    OrigNet As Integer 'Номер сети отправителя
    OrigNode As Integer 'Номер узла отправителя
    OrigPoint As Integer 'Номер поинта отправителя
    DestZone As Integer 'Номер зоны получателя (обычно 2)
    DestNet As Integer 'Номер сети получателя
    DestNode As Integer 'Номер узла получателя
    DestPoint As Integer 'Номер поинта получателя
    ReplyID As Long 'Идентификатор ответа  ReplyID (устанавливается и используется тоссером)
    NestLevel As Long 'Временное поле, используемое для построения связанного списка ответов
    UnixTime As Long 'Время создания письма в формате, принятом в UNIX
    ZoneNet As Long 'Старшие 16 бит содержат номер зоны, младшие 16 бит - номер сети получателя
    node As Long 'Номер узла получателя (для тех писем, у которых установлен флаг письма DB_Mail_Route_to_Boss)
    MailText As Long 'String * 4 'Указатель на начало текста (может быть nil)
End Type

Так вот. Сообщения поступают пакетами. Каждый пакет представляет из себя своеобразный текстовый файл с определённой сигнатурой в начале (заголовком), которая содержит обобщённую информацию (дата приёма пакета, адрес отправителя, адрес получателя).
И сооответственно пакет может содержать от 1 до нескольких десятков сообщений, разделённых между собой определённой сигнатурой. В начале каждого сообщения в определённом формате (через символ chr(0) прописаны общие данные о текущем сообщении: тема, дата создания, отправитель, получатель и конференция. Это как бы заголовок сообщения. Дальше идут служебные строки сообщения предваряемые символом с кодом 1 (chr(1)). В этих строках содержится информация об идентификаторе письма (опять же в Hex-виде) и об идентификаторе письма на которое отвечаем (если текущее письмо ответ) опять же в Hex-виде. При обработке сообщений мне нужно запихать данные о письме в структуру, которую описал выше.
И если MsgID я могу и так получить (преобразовав дату письма из заголовка к Unix-времени - кол. секунд с 01.01.1970) , то вот ReplyID (идентификатор письма на которое отвечаем) я могу получить только в текстовом виде. А запихнуть мне это значение опять же нужно в структуру заголовка.
Вот такая задача возникла у меня....
Надеюсь на вашу помощь

P.S. А я то ещё думал, почему тоссеров нет на VB.... Видимо поэтому...
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

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

Сообщение alibek » 28.12.2005 (Ср) 16:08

Тебе же GSerg и Anrey Fedorov написали готовые функции...
Lasciate ogni speranza, voi ch'entrate.

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 28.12.2005 (Ср) 17:01

alibek
Не спорю. За что GSerg'у и Anrey Fedorov'у отдельное СПАСИБО.
Просто последний посто для тех, кто может быть не понял ситуацию. :)
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 28.12.2005 (Ср) 18:01

alibek писал(а):
Ruslan Demidow писал(а):Т.е. например число e13b9b44 будет в результате преобразования иметь вид -516187324 - и это будет правильным результатом?
Как же мне получить беззнаковое число (как в С++) из e13b9b44.

Пиши ?9Val("&h" & e13b9b44 )+2147483648@)

Ругается... :( 'Expected:Expression'). :(
То же самое на ?CLng(&H7FFFFFFF).
Может я туплю и что-то делаю не так? :oops:
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 28.12.2005 (Ср) 18:09

Строку подставлять нужно...

CLng("&H7FFFFFFF")
Val("&h" & "e13b9b44")+2147483648
То, что для одних константа, для других только переменная...

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 28.12.2005 (Ср) 20:15

А всё равно в итоге получаю число. Прибавляю это число (количество секунд) к дате 01.01.1970 и получаю что письмо было создано более 15-ти лет назад. :(
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

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

Сообщение Andrey Fedorov » 29.12.2005 (Чт) 8:21

Ruslan Demidow писал(а):Ругается... :( 'Expected:Expression'). :(
То же самое на ?CLng(&H7FFFFFFF).
Может я туплю и что-то делаю не так? :oops:


Что-то ты путаешь - на

?CLng(&H7FFFFFFF)

ругаться не должно. Как и на

?CLng(&HFFFFFFFF)

И вообще большого смысла писать так нет ибо можно просто

?&H7FFFFFFF

или

?&HFFFFFFFF

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

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 30.12.2005 (Пт) 14:09

Andrey Fedorov писал(а):
Ruslan Demidow писал(а):Ругается... :( 'Expected:Expression'). :(
То же самое на ?CLng(&H7FFFFFFF).
Может я туплю и что-то делаю не так? :oops:


Что-то ты путаешь - на

?CLng(&H7FFFFFFF)

ругаться не должно. Как и на

?CLng(&HFFFFFFFF)

И вообще большого смысла писать так нет ибо можно просто

?&H7FFFFFFF

или

?&HFFFFFFFF

так как в данном случае никакого преобразования типов даже не нужно. Об этом тебе GSerg еще в самом начале писал.

Ну в общем да. GSerg оказался как всегда прав и я сделал немного по другому. Делаю всё же через Val("&H" & "e15b43f6") и получаю отрицательное число. Но решил плюнуть и воткнуть в поле структуры полученное значение. Приняло. Меня просто больше всего волновал вопрос как это воспримет программа, которая тоже работает с этой базой и этими данными и написана на С++. Вроде бы нормально воспринимает. :)
Всем БОЛЬШОЕ СПАСИБО за участие.
Топик можно считать закрытым.
Это Ж-ж-ж-ж неспроста (с) Винни-Пух


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

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

Сейчас этот форум просматривают: AhrefsBot и гости: 160

    TopList