- #1
R
Rassamie
Neues Mitglied
Themenersteller
- Dabei seit
- 29.03.2005
- Beiträge
- 1
- Reaktionspunkte
- 0
Ich habe eine Datei die binär weggeschrieben wurde (mit einem Programm in c++ 6.0) nun muss ich die Datei einlesen mit C#. Dabei ist der folgende Codeverwednet worden um die Datei in C++ zu lesen:
....
// Lesen des Keys
pAr->ReadString(Key);
// Lesen des Datentyps
VARTYPE vType;
_variant_t vData;
pAr->Read(&vType,sizeof(vType));
// Aus Kompatibilitätsgründen händisch
if (!loadSingleAttribute(pAr,vType,vData))
{
CAttributesCollection::Error(IDSERR_0007);
return E_FAIL;
}
.....
bool CAttributesCollection::loadSingleAttribute(CArchive *pAr, VARTYPE vType, _variant_t& value)
{
USES_CONVERSION;
// Lesen der Daten
switch (vType)
{
case VT_BSTR:
{
char *Buffer;
short len;
pAr->Read(&len,sizeof(len));
Buffer=new char[len+1];
pAr->Read(Buffer,len);
*(Buffer+len)='\0';
value=_variant_t(_bstr_t(Buffer));
delete[] Buffer;
break;
}
case VT_I4:
{
long lData;
pAr->Read(&lData,sizeof(lData));
value=_variant_t(lData,VT_I4);
break;
}
case VT_I2:
{
short iData;
pAr->Read(&iData,sizeof(iData));
value=_variant_t(iData,VT_I2);
break;
}
case VT_R8:
{
double dData;
pAr->Read(&dData,sizeof(dData));
value=_variant_t(dData,VT_R8);
break;
}
case VT_BOOL:
{
bool bData;
pAr->Read(&bData,sizeof(bData));
value=_variant_t(bData);
break;
}
case VT_DECIMAL:
{
DECIMAL decData;
pAr->Read(&decData,sizeof(decData));
value=_variant_t(decData);
break;
}
case VT_NULL:
value.vt=VT_NULL;
break; // Nichts weiter zu lesen
case VT_EMPTY:
value.vt=VT_EMPTY;
break; // Nichts weiter zu lesen
default:
return false;
}
return true;
}
......
Ich habe nun folgendes in C#:
// Datei öffnen
System.IO.FileStream fs = new System.IO.FileStream this.Name,System.IO.FileMode.Open,System.IO.FileAccess.Read);
System.IO.BinaryReader myReader = new System.IO.BinaryReader(fs);
// Attribute der Datensicht einlesen
long numAtts = myReader.ReadInt32();
if (numAtts>0)
{
for (int AttsIndex=0;AttsIndex<numAtts;AttsIndex++)
{
// Lesen des Keys
string Key = myReader.ReadString();
Die Anzahl wird denke ich noch richtig gelesen aber der erste String stimmt schon nicht mehr da is der Rest der Datei drinn. Ich hab mal im Hex-Editor nachgesehen nach dem String steht immer 0A ist das hier keine gültige Terminierung für den String? und wenn nein was muss ich nun machen anstatt. ODer muss ich ganz anders ans Werk gehen?
Mit bestem Dank im Voraus
Markus
....
// Lesen des Keys
pAr->ReadString(Key);
// Lesen des Datentyps
VARTYPE vType;
_variant_t vData;
pAr->Read(&vType,sizeof(vType));
// Aus Kompatibilitätsgründen händisch
if (!loadSingleAttribute(pAr,vType,vData))
{
CAttributesCollection::Error(IDSERR_0007);
return E_FAIL;
}
.....
bool CAttributesCollection::loadSingleAttribute(CArchive *pAr, VARTYPE vType, _variant_t& value)
{
USES_CONVERSION;
// Lesen der Daten
switch (vType)
{
case VT_BSTR:
{
char *Buffer;
short len;
pAr->Read(&len,sizeof(len));
Buffer=new char[len+1];
pAr->Read(Buffer,len);
*(Buffer+len)='\0';
value=_variant_t(_bstr_t(Buffer));
delete[] Buffer;
break;
}
case VT_I4:
{
long lData;
pAr->Read(&lData,sizeof(lData));
value=_variant_t(lData,VT_I4);
break;
}
case VT_I2:
{
short iData;
pAr->Read(&iData,sizeof(iData));
value=_variant_t(iData,VT_I2);
break;
}
case VT_R8:
{
double dData;
pAr->Read(&dData,sizeof(dData));
value=_variant_t(dData,VT_R8);
break;
}
case VT_BOOL:
{
bool bData;
pAr->Read(&bData,sizeof(bData));
value=_variant_t(bData);
break;
}
case VT_DECIMAL:
{
DECIMAL decData;
pAr->Read(&decData,sizeof(decData));
value=_variant_t(decData);
break;
}
case VT_NULL:
value.vt=VT_NULL;
break; // Nichts weiter zu lesen
case VT_EMPTY:
value.vt=VT_EMPTY;
break; // Nichts weiter zu lesen
default:
return false;
}
return true;
}
......
Ich habe nun folgendes in C#:
// Datei öffnen
System.IO.FileStream fs = new System.IO.FileStream this.Name,System.IO.FileMode.Open,System.IO.FileAccess.Read);
System.IO.BinaryReader myReader = new System.IO.BinaryReader(fs);
// Attribute der Datensicht einlesen
long numAtts = myReader.ReadInt32();
if (numAtts>0)
{
for (int AttsIndex=0;AttsIndex<numAtts;AttsIndex++)
{
// Lesen des Keys
string Key = myReader.ReadString();
Die Anzahl wird denke ich noch richtig gelesen aber der erste String stimmt schon nicht mehr da is der Rest der Datei drinn. Ich hab mal im Hex-Editor nachgesehen nach dem String steht immer 0A ist das hier keine gültige Terminierung für den String? und wenn nein was muss ich nun machen anstatt. ODer muss ich ganz anders ans Werk gehen?
Mit bestem Dank im Voraus
Markus