Avatar billede thers Nybegynder
06. januar 2003 - 15:12 Der er 26 kommentarer og
1 løsning

half-life server response / client online time datatype ?

Hej

Jeg har lavet et program der queryer en HL-server. Jeg hiver al informationen ud af det svar jeg får fra serveren, bortset fra den tid clienten har været online.

Jeg har fundet denne dokumentation her :
http://www.kquery.com/texts/server_query.txt.

I den står der at online-tiden gives som (float32).

svaret fra serveren kan f.eks. se sådan ud "t¿ÎC" altså fire bytes. Mit spørgsmål er, hvordan får jeg konverteret disse 4 bytes til noget jeg kan bruge i visual basic ?? det skal ende med at blive et tidsformat (hh:mm:ss) .

/thers
Avatar billede sjh Nybegynder
06. januar 2003 - 16:09 #1
er ikke sikker på at det er sådan men prøv :-)

Private Sub Form_Load()
Dim bytData() As Byte
Dim intTime As Integer

bytData() = StrConv("t¿ÎC", vbFromUnicode)
intTime = CInt(StrConv(bytData(0), vbUnicode)) & _
          CInt(StrConv(bytData(1), vbUnicode)) & _
          CInt(StrConv(bytData(2), vbUnicode)) & _
          CInt(StrConv(bytData(3), vbUnicode))


Me.Caption = SecToTime(intTime)
End Sub

Private Function SecToTime(Sec As Variant) As String
Dim Min As Variant
  Min = Format(Fix(Sec / 60), "00")
SecToTime = Format(Fix(Min / 60), "00") & ":" & _
            Format(Min Mod 60, "00") & ":" & _
            Format(Sec Mod 60, "00")
End Function
Avatar billede sjh Nybegynder
06. januar 2003 - 16:17 #2
ellers kan du prøve at lave "& _" om til "+ _" eller "* _" :)
Avatar billede thers Nybegynder
07. januar 2003 - 08:57 #3
Det virker desværre ikke.. det giver forkerte tider.
Men kan det have noget at gøre med at datatypen er float32 fra start ?
Avatar billede sjh Nybegynder
07. januar 2003 - 09:16 #4
hvad skal "t¿ÎC" give i tid? eller har du en "t¿ÎC" kode hvor du ved hvad tiden er?
Avatar billede arnvig Nybegynder
07. januar 2003 - 09:37 #5
Thers: hvilket format er tidskoden i ?  (f.eks: Antal sekunder eller et format ddmmyyssmmm)
Avatar billede thers Nybegynder
07. januar 2003 - 09:56 #6
sjh >>
Jeg kan give en cirka tid inden for et par sekunder:

Û˜B

skulle svare til:

00:01:13

arnvig >>

se evt. linket i topic ang. format .
det er svaret serveren giver på "ÿÿÿÿplayers" det drejer sig om.
Avatar billede arnvig Nybegynder
07. januar 2003 - 10:01 #7
Float32 består af 32 bits hvor af nogen er dedikerede til selve tallet og nogen til eksponenten.

eksempel 234500  = 2345 * 10^2  Tallet er 2345 og eksponenten er 2
eller    2,345  = 2345 * 10^-3  Tallet er 2345 og eksponenten er -3

man kunne bruge 16 bits til tallet og 16 bits til eksponenten

Så du skal vide hvorledes denne float32 er bygget og hvad den indeholder f.eks tiden i sekunder
Avatar billede thers Nybegynder
07. januar 2003 - 10:06 #8
Jeg tror dette er et bedre eksempel.

Û·6D med byteværdierne :    219:183:54:68

svarer til

00:12:08
Avatar billede arnvig Nybegynder
07. januar 2003 - 10:12 #9
12 minutter og 8 sek = 728 sek ?
Avatar billede arnvig Nybegynder
07. januar 2003 - 10:19 #10
hvordan får du de byteværdier ? hvilken tabel oversætter du med ?
Avatar billede thers Nybegynder
07. januar 2003 - 12:25 #11
Jeg har fundet denne funktion på nettet og det er den jeg brugte til at få byte værdierne.

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Public Function StringToLng(ByVal InputString As String) As Long
    Dim strBuffer As String '* Len(InputString)
    Dim lngValue As Long

    strBuffer = StrReverse(InputString)
    CopyMemory lngValue, ByVal strBuffer, Len(InputString)
    StringToLng = lngValue
End Function
Avatar billede thers Nybegynder
07. januar 2003 - 12:27 #12
arnvig >> den eneste dokumentation jeg har, er den fra ovenstående link. Så jeg ved ikke hvordan float32 er sat sammen.
Avatar billede thers Nybegynder
07. januar 2003 - 12:28 #13
ja, 728 sek.
Avatar billede sjh Nybegynder
07. januar 2003 - 13:57 #14
jeg har fundet noget på siden her, som liner Float32 udregning.
Det giver da "00:12:08"

http://www.westfaro.com/software/kickstart/kickstart_scripts.asp?action=viewscript&sid=29

(Case Float32, Float64)


Private Sub Form_Load()
'Û·6D med byteværdierne :    219:183:54:68
'svarer til
'00:12:08

  Me.Caption = SecToTime(Float32(219) + Float32(183) + Float32(54) + Float32(68) * 4)
End Sub

Private Function SecToTime(Sec As Variant) As String
Dim Min As Variant
  Min = Format(Fix(Sec / 60), "00")
SecToTime = Format(Fix(Min / 60), "00") & ":" & _
            Format(Min Mod 60, "00") & ":" & _
            Format(Sec Mod 60, "00")
End Function

Public Function Float32(ByVal intNum As Integer) As Double
  Float32 = CDbl(CLng(intNum)) Mod 1000000000
End Function
Avatar billede thers Nybegynder
07. januar 2003 - 14:25 #15
sjh >> det så meget overbevisende ud. men det virker desværre ikke generelt. Åbenbart kun lige på eksemplet med 00:12:08
Avatar billede sjh Nybegynder
07. januar 2003 - 14:35 #16
vent 2 sek her en ny :))
Avatar billede thers Nybegynder
07. januar 2003 - 14:46 #17
ok kool :)
Avatar billede sjh Nybegynder
07. januar 2003 - 14:50 #18
Det her virker med de 2 eksempler du er kommet med. :-)

'Û˜B
'skulle svare til:
'00:01:13

'Û·6D med byteværdierne :    219:183:54:68
'svarer til
'00:12:08

Option Explicit

Private Type FloatBytes
  Byte1 As Byte
  Byte2 As Byte
  Byte3 As Byte
  Byte4 As Byte
End Type

Private Type FloatSingle
  Single1 As Single
End Type

Private Function Float32(InBytes() As Byte) As Single
Dim typFB As FloatBytes
Dim typFS As FloatSingle

  typFB.Byte1 = InBytes(0)
  typFB.Byte2 = InBytes(1)
  typFB.Byte3 = InBytes(2)
  typFB.Byte4 = InBytes(3)

  LSet typFS = typFB

Float32 = typFS.Single1
End Function

Private Function SecToTime(Sec As Variant) As String
Dim Min As Variant
  Min = Format(Fix(Sec / 60), "00")
SecToTime = Format(Fix(Min / 60), "00") & ":" & _
            Format(Min Mod 60, "00") & ":" & _
            Format(Sec Mod 60, "00")
End Function

Private Sub Form_Load()
Dim ThemBytes(3) As Byte

'Û˜B
'skulle svare til:
'00:01:13
ThemBytes(0) = Asc("Û")
ThemBytes(1) = Asc("")
ThemBytes(2) = Asc("˜")
ThemBytes(3) = Asc("B")


'Û·6D med byteværdierne :    219:183:54:68
'svarer til
'00:12:08
ThemBytes(0) = Asc("Û")
ThemBytes(1) = Asc("·")
ThemBytes(2) = Asc("6")
ThemBytes(3) = Asc("D")

Me.Caption = SecToTime(Float32(ThemBytes) - 3)
End Sub
Avatar billede sjh Nybegynder
07. januar 2003 - 14:51 #19
eksperten laver hvist ged i den (ThemBytes(2) = Asc("˜"))
Avatar billede thers Nybegynder
07. januar 2003 - 15:00 #20
YES !...du er min guru ;)
hvordan / hvor fik du ideen ?
Avatar billede thers Nybegynder
07. januar 2003 - 15:05 #22
ok nice ! kan du forklare hvorfor du trækker 3 fra tilsidst, eller er det bare een af de ting man ikke skal spørge om ? ;)

SecToTime(Float32(ThemBytes) - 3)
Avatar billede sjh Nybegynder
07. januar 2003 - 15:09 #23
ellers giver det ikke det antal sek :-), eller også er det

Dim ThemBytes(3) As Byte
3 som er lykke tal ;-)
Avatar billede thers Nybegynder
07. januar 2003 - 15:25 #24
Som sagt var eksempel tiderne kun ca. så jeg tror at det passer uden. Men jeg kan da lige tilføje et par tretaller hist og her for en sikkerheds skyld.
thanx again ! :o)

public sub hiddenMessage
    MsgBox("3 is the magic number!")
end sub
Avatar billede sjh Nybegynder
07. januar 2003 - 15:32 #25
ha ha... selv tak for point :)
Avatar billede sjh Nybegynder
07. januar 2003 - 15:41 #26
hvordan har du lavet int32 ?
Avatar billede thers Nybegynder
07. januar 2003 - 15:48 #27
ja, den er overraskende simpel i forhold til den anden. Men jeg tror at den kun virker lige i denne sammenhæng, da jeg ved på forhånd at tallet jeg forventer ligger mellem -127 og 127
   
  intFrags = Asc(strFourBytes)
                   
                    If intFrags > 128 Then
                        intFrags = -(256 - intFrags)
                    End If
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester