Datentypen

17/10/2012 - 19:51 von Lothar Geyer | Report spam
Ich habe ein Problem mit dem Verstehen. Ihr könnt mir sicher helfen.
Folgendes Szenario:

Dim TxtLine as String
sckMail.SendData TxtLine & vbCrLf

und

Dim bInFile() As Byte
Get #hFile, , bInFile()
sckMail.SendData EncodeBase64Byte(bInFile)

wobei

Public Function EncodeBase64Byte(InArray() As Byte) As Byte()

Das funktioniert auch pràchtig.

Wenn ich daraus jetzt folgendes mache (bei gleichen Bedingungen)

Dim TxtLine as String
SendToHost TxtLine & vbCrLf

und

SendToHost EncodeBase64Byte(bInFile)

mit

Private Sub sendToHost(Data As Variant)

sckMail.SendData Data & vbCrLf

kommt nur Schrott raus.

Was habe ich übersehen?

Lothar Geyer
 

Lesen sie die antworten

#1 Schmidt
17/10/2012 - 20:45 | Warnen spam
Am 17.10.2012 19:51, schrieb Lothar Geyer:

Dim TxtLine as String
sckMail.SendData TxtLine & vbCrLf

und

Dim bInFile() As Byte
Get #hFile, , bInFile()
sckMail.SendData EncodeBase64Byte(bInFile)

wobei

Public Function EncodeBase64Byte(InArray() As Byte) As Byte()

Das funktioniert auch pràchtig.

Wenn ich daraus jetzt folgendes mache (bei gleichen Bedingungen)

Dim TxtLine as String
SendToHost TxtLine & vbCrLf

und

SendToHost EncodeBase64Byte(bInFile)

mit

Private Sub sendToHost(Data As Variant)

sckMail.SendData Data & vbCrLf

kommt nur Schrott raus.

Was habe ich übersehen?



Deine Funktion: EncodeBase64Byte

returniert ein ByteArray, was ein wenig seltsam ist,
da man die Base64-Encodierung ja eigentlich genau deshalb
benutzt, um binàren Input (InArray() as Byte ist also Ok)
in einen "übertragungssicheren Ascii-Textbereich" zu
verschieben (auf Kosten von 33% Overhead im Transfer-Volumen).

Also ein Rückgabewert As String würde Dein Problem bereits
lösen. (Ginge ziemlich einfach über die StrConv-Funktion):

Public Function EncodeBase64ToString(InArray() As Byte) As String
EncodeBase64ToString = StrConv(EncodeBase64Byte(InArray), vbUnicode)
End FUnction

Falls Du das Base64-Enkodieren auf ByteArray-returnierender
Basis belassen willst, müsstest Du die Funktion hier:

Private Sub sendToHost(Data As Variant)
sckMail.SendData Data & vbCrLf
End Sub

so abàndern:

Private Sub sendToHost(Data As Variant)
If VarType(Data) = vbString Then
sckMail.SendData Data & vbCrLf
Else
Dim B() As Byte, UB as Long
B = Data
UB = UBound(B)
Redim Preserve B(UB + 2)
B(UB+1) = 13: B(UB+2) = 10 'apply CR+LF

sckMail.SendData B
End If
End Sub

Die Ursache, dass das bisher nicht klappt ist,
dass der Concat-Operator & eine String-Konvertierung
des in Data enthaltenen ByteArrays forciert... und dann
kommen aber VBs WideString (16Bit)-Regeln mit ins Spiel.

TestCode (in eine Form):

Option Explicit

Private Sub Form_Load()
Dim TestBytesAnsi(2) As Byte
TestBytesAnsi(0) = 65 'A
TestBytesAnsi(1) = 66 'B
TestBytesAnsi(2) = 67 'C

Dim V As Variant
V = TestBytesAnsi
'nàchste Zeile ergibt Salat (da der Inhalt von V mit 16Bit
'Character-Breite interpretiert wird, die Zeichen am Index
'0 und 1 (65 u. 66) werden somit als ein einzelnes WChar betrachtet)
Debug.Print V & vbCrLf & "XYZ"

'also vor der Verkettung besser den "engen" (8Bit-Inhalt)
'von V auf 16bit Breite anheben
Debug.Print StrConv(V, vbUnicode) & vbCrLf & "XYZ"

Debug.Print
Debug.Print " folgendes klappt aber auf direktem Wege "
Debug.Print

Dim TestBytesWide(5) As Byte
TestBytesWide(0) = 65 'A
TestBytesWide(2) = 66 'B
TestBytesWide(4) = 67 'C

V = TestBytesWide

Debug.Print V & vbCrLf & "XYZ"

'oder auch direkt vom ByteArray, ohne Umweg über die Variant-Hülle
Debug.Print CStr(TestBytesWide) & vbCrLf & "XYZ"

'und das nur nochmal zur Verdeutlichung (in der Gegenrichtung)
'dass die direkten Konvertierungen zwischen VB-ByteArrays und
'VB-Strings immer unicodefàhig (16Bit breit) erfolgen
Dim i As Long, B() As Byte, S As String
S = "ABC"
B = S
For i = 0 To UBound(B): Debug.Print B(i);: Next
Debug.Print
End Sub

Olaf

Ähnliche fragen