Newsgroup: it.comp.lang.visual-basic
Titolo: Da Long a String

Salve,
dovrei trasformare un intero lungo nella stringa di 4 caratteri come
quando l'intero lo scrivo in un file con un Put(...). Ho provato con le
due funzioni sotto: con i numeri positivi va tutto liscio, ma con i
negativi non va e non so come fare.
Grazie.
Private Function LongToString(ByVal l As Long) As String
  Dim ch As Long
  For i = 0 To 3
    ch = l Mod 256
    if ch < 0 then ch = 256 + ch   '<--- bo?!?
    LongToString = LongToString & Chr(ch)
    l = Int(l / 256)
  Next i
End Function
Private Function StringToLong(s As String) As Long
  Dim l As Long
  If Len(s) <> 4 Then
    Err.Raise 5
    Exit Function
  End If
  For i = 1 To 4
    ch = Asc(Mid$(s, i, 1))
    l = l + ch * (256 ^ (i - 1))
  Next i
  StringToLong = l
End Function

 Grazie.
E se usassi le funzioni CStr() e CLng()?
Esempio:
CStr(12345&) -> "12345"
CStr(-12345&) -> "-12345"
CLng("12345") -> 12345&
CLng("-12345") -> -12345&
Ciao!
--
Esteban
Hosted by 
www.seber.it
(Remove nonspammare for reply)

 quando l'intero lo scrivo in un file con un Put(...).
Io mi ero fatto questa funzioncina, volendo la puoi riadattare ma puņ gią
andarti bene:
Private Declare Function CopyMemory Lib "kernel32" Alias "RtlMoveMemory"
(pDst As Any, pSrc As Any, ByVal BytesLen As Long) As Long
Function TMem(ByVal pSrc As Variant, ByVal Size As Long) As String
    ' Size č ignorato per tutti i tipi
    ' a lunghezza fissa indicati
    Select Case VarType(pSrc)
    Case vbLong
        TMem = String$(4, vbNullChar)
        Call CopyMemory(ByVal TMem, CLng(pSrc), 4)
    Case vbDate
        TMem = String$(8, vbNullChar)
        Call CopyMemory(ByVal TMem, CDate(pSrc), 8)
    Case vbDouble
        TMem = String$(8, vbNullChar)
        Call CopyMemory(ByVal TMem, CDbl(pSrc), 8)
    Case vbSingle
        TMem = String$(4, vbNullChar)
        Call CopyMemory(ByVal TMem, CSng(pSrc), 4)
    Case Else
        TMem = String$(Size, vbNullChar)
        Call CopyMemory(ByVal TMem, ByVal CStr(pSrc), Size)
    End Select
End Function
Es. Debug.print TMem(123&, 4)
Ciao

 ha scritto nel messaggio
news:ZvGq8.46821$pT1.1...@news1.tin.it...


 Comunque grazie!
E questa ti va bene?
Ciao

 quando l'intero lo scrivo in un file con un Put(...)
Private Function PFun_LongToLong(myLong As Long) As String
    Dim tstr As String
    Dim rstr As String
    Dim c As Long
    tstr = Right$("00000000" + Hex$(myLong), 8)
    For c = 3 To 0 Step -1
        rstr = rstr + Chr$("&H" + Mid$(tstr, c * 2 + 1, 2))
    Next c
    PFun_LongToLong = rstr
End Function
Prova, ciao.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 Private Function PFun_LongToLong(myLong As Long) As String
A questo punto si poteva fare molto piů elegantemente cosě:
Public Function PFun_LongToLong(myLong As Long) As String
    Dim myByte As Byte
    Dim i As Long
    For i = 0 To 3
        myByte = myLong And &HFF
        myLong = myLong \ &H100
        PFun_LongToLong = PFun_LongToLong & Chr$(myByte)
    Next i
End Function

 End Function
Non funziona con i numeri negativi.
Prova con -1, ti restituisce 255, 0, 0, 0
 invece di esatto 255, 255, 255, 255 .
Il motivo č che l'istruzione myLong = myLong \ &H100
 non fa uno shift di 8 bit, come farebbe se
 implementata in assembly, ma una vera divisione,
 ossia -1 \ 255 = 0.
Ciao.


>  ossia -1 \ 255 = 0.
Pardon, -1 \ 256 = 0.


  ossia -1 \ 255 = 0.
Acc! E' vero :)
Ero indeciso tra l'implementazione che ho postato (che mi sembrava più
elegante) e questa qui sotto... ho scelto il 50% sbagliato :)
Ciao
Public Function PFun_LongToLong(myLong As Long) As String
    Dim bytes(1 To 4)
    bytes(1) = myLong And &HFF
    bytes(2) = (myLong And &HFF00&) \ &H100& ' occhio all'"&"!
    bytes(3) = (myLong And &HFF0000) \ &H10000
    bytes(4) = (myLong And &H7F000000) \ &H1000000
    If (myLong < 0) Then bytes(4) = bytes(4) Or 128 ' il bit di segno!
    PFun_LongToLong = Chr$(bytes(1)) & _
                      Chr$(bytes(2)) & _
                      Chr$(bytes(3)) & _
                      Chr$(bytes(4))
End Function