Часть строки
01000000 EABEFEFF 71BE0300 80F1FFFF
Как её преобразовать в такой вид?
1 -82198 245361 -3712
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
GSerg писал(а):Просто странно, что такое в виде строки. Такое обычно не бывает в виде строки, а если бывает, то это ручки
FaKk2 писал(а):Greis
Он имел ввиду хендлы. В системе у всех обьектов (окон например) есть идентификационный номер. Например 150E56h или 1379926d
Greis писал(а):Требовалось прочитать файл .bin по 4 байта и преобразовать его в подобие тех строк, что я написала. Изменить и обратно.
GSerg писал(а):Почему после чтения бинарного файла образуется строка? Потому что содержимое файла было узрето в некоем hex-редакторе?
4байта - количество блоков в файле(только один раз в начале)
====сам блок======
4байта - кол-во символов в имени (n)
n*2байта - имя блока в юникод
4байта - всегда 0
4байта - кол-во координат (дальше сами координаты)
4байта - индекс координаты(с 0 и до...уникальны по всему файлу)
4байта - x
4байта - y
4байта - z
дальше повторяются координаты(всё по 4 байта) и по окончании сразу идёт второй блок.
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
Сейчас этот форум просматривают: Yandex-бот и гости: 26