Конвертация из HEX

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

Конвертация из HEX

Сообщение Greis » 01.03.2007 (Чт) 20:46

Часть строки
01000000 EABEFEFF 71BE0300 80F1FFFF
Как её преобразовать в такой вид?
1 -82198 245361 -3712

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

Сообщение GSerg » 01.03.2007 (Чт) 20:50

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

Greis
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 30.03.2006 (Чт) 22:53

Сообщение Greis » 01.03.2007 (Чт) 21:33

Да на 100%. Только уверенА :)
EABEFEFF = -82198 (32bit Signed Long)
EABEFEFF = 4294885098 (32bit Unsigned Long)

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

Сообщение GSerg » 01.03.2007 (Чт) 22:10

Просто странно, что такое в виде строки. Такое обычно не бывает в виде строки, а если бывает, то это ручки :roll:

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

Private Sub Form_Load()
  MsgBox ntohl("01000000")
  MsgBox ntohl("EABEFEFF")
  MsgBox ntohl("71BE0300")
  MsgBox ntohl("80F1FFFF")
End Sub

Private Function ntohl(s As String) As Long
  Dim t As Long
 
  t = CLng("&h" & s)
  ntohl = t And &HFF&
  If ntohl And &H80& Then ntohl = ((ntohl And &H7F&) * &H1000000) Or &H80000000 Else ntohl = ntohl * &H1000000
  ntohl = ntohl Or (((t And &HFF000000) \ &H1000000) And &HFF&) Or ((t And &HFF0000) \ &H100&) Or ((t And &HFF00&) * &H100&)
End Function
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Greis
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 30.03.2006 (Чт) 22:53

Сообщение Greis » 02.03.2007 (Пт) 0:08

Спасибо.
GSerg писал(а):Просто странно, что такое в виде строки. Такое обычно не бывает в виде строки, а если бывает, то это ручки

Да и ножки тоже :D Мы человеки малограмотные...вот и бродим по форумам в поисках подаяния.
Требовалось прочитать файл .bin по 4 байта и преобразовать его в подобие тех строк, что я написала. Изменить и обратно. Вот и выдернула от туда строчку. :) Потому как 2 дня поисков и чтений были безрезультатными. Даже непредставляла как эти числа получить. Самое интересное, после создания темы теоритически вопрос решила. 4294885098 из EABEFEFF - получила.
И появился вопрос: Нет ли функции конвертации из (single)4294885098 в (long)-82198 ?(если я правильно поняла их тип)
P.S. За пример ещё раз спасибо. Хочется уже побольше понять...раз уж тема создана. Циферь незнакомых много...пошла изучать :D

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 02.03.2007 (Пт) 0:27

Greis
Он имел ввиду хендлы. В системе у всех обьектов (окон например) есть идентификационный номер. Например 150E56h или 1379926d

Greis
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 30.03.2006 (Чт) 22:53

Сообщение Greis » 02.03.2007 (Пт) 1:53

FaKk2 писал(а):Greis
Он имел ввиду хендлы. В системе у всех обьектов (окон например) есть идентификационный номер. Например 150E56h или 1379926d


Вот только ненадо меня путать. Я и так мало понимаю. Для чего мне процессы?
Мне просто требуется прочитать файл, изменить и записать обратно. Да и с чтением разберусь. Интересует только перевод из в и обратно.

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

Сообщение GSerg » 02.03.2007 (Пт) 7:56

Greis писал(а):Требовалось прочитать файл .bin по 4 байта и преобразовать его в подобие тех строк, что я написала. Изменить и обратно.

Вот именно.
По 4 байта. А не по 16+4, как в каждой из этих строк.
Почему после чтения бинарного файла образуется строка? Потому что содержимое файла было узрето в некоем hex-редакторе? :) Там оно, разумеется, от младшего байта к старшему. Так и должно быть. И берётся это одной командой get без всяких преобразований.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Greis
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 30.03.2006 (Чт) 22:53

Сообщение Greis » 02.03.2007 (Пт) 19:33

GSerg писал(а):Почему после чтения бинарного файла образуется строка? Потому что содержимое файла было узрето в некоем hex-редакторе?

Потому, что я её даже не пыталась читать :) Мы как "умные" люди решили сразу с середины и неправильно (открыли в редакторе и решили получить то , что нужно). Честно говоря не думала, что так просто, но всё-равно есть проблемка. Формат файла.
Код: Выделить всё
4байта - количество блоков в файле(только один раз в начале)
====сам блок======
4байта     - кол-во символов в имени (n)
n*2байта - имя блока в юникод
4байта     - всегда 0
4байта     - кол-во координат (дальше сами координаты)
4байта     - индекс координаты(с 0 и до...уникальны по всему файлу)
4байта     - x
4байта     - y
4байта     - z
дальше повторяются координаты(всё по 4 байта) и по окончании сразу идёт второй блок.
Как его корректно прочитать - незнаю. Первое имя то я прочитаю, а дальше...блоки разные..имена разные...разделителей - невижу(после имени идёт 0...так некоторые координаты тоже 0) как и я тоже :D

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

Сообщение GSerg » 02.03.2007 (Пт) 20:34

Почему такая мысль, как "Открыть документацию и прочитать её", в голову людям не приходит? :roll:
Количество подсказок ограничено. По их окончании будут только пинки в направлении мануалов.

Код: Выделить всё
private type Coord
  Index as long
  x as long
  y as long
  z as long
end type

private type Block
  Name as string
  Stuff as long
  CoordCount as long
  Coords() as Coord
end type

private type FileContent
  BlockCount as long
  Blocks() as Block
end type

private sub addsfs()
  dim fc as filecontent, fn as integer, i as long, t as long
 
  fn=freefile
  open "c:\1.dat" for binary access read as #fn
  get #fn,,fc.blockcount
  redim fc.blocks(1 to fc.blockcount)
  for i=1 to fc.blockcount
    with fc.blocks(i)
      get #fn,,t
      .name=space$(t*2)
      get #fn,,.name
      .name=strconv(.name, vbfromunicode)
      get #fn,,.stuff
      get #fn,,.coordcount
      redim .coords(1 to .coordcount)
      get #fn,,.coords
    end with
  next
  close #fn
 
  msgbox fc.blockcount
  msgbox fc.blocks(1).name
  msgbox fc.blocks(3).coords(3).y
end sub
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 60

    TopList