Autor Beitrag
hvse
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Di 27.10.09 14:34 
Guten Tag.

Ich fürchte, ich habe bald keine Haare mehr auf dem Kopf, so zermartert mir dieses Problem denKopf ;-((

Es geht um folgendes:

Ich habe eine Tabelle, in der in einem NTEXT - Feld binäre Daten stehen. Früher gab es eine VB6-Anwendung, mit der ich mit einem ganz einfachen ADODB-recordset die Daten als string bekommen habe. Wenn ich dort durch die einzelnen Zeichen springe, stimmt jedes Zeichen.

Jetzt muss ich diese App auf CSharp portieren. Es klappt auch der DAtenzugriff und das Auslesen der Daten. Wo ich allerdings Probleme habe, ist die Interpretation bestimmter Zeichen.

In der DB steht irgend etwas, was ich mit VB6 als "bytefolge" 120,156,189 bekomme. Das ist richtig.

Mit Csharp bekomme ich immer die Folge 120,339,189 oder, wenn ich die Daten per GetByes lese, bekomme ich 120,0,83,1,189,0. Gut, beides it im Endeffekt das gleiche.

Was ich nur wissen müsste, warum ich mit CSharp nicht 120,156,189 bekomme.

(Ich denke mal, dass die Bytes 120 und 189 nicht relevant sind, aber man weiß ja nie...)

Ich weiß, die Speicherung von binären Daten in NTEXT int nicht besonders vorteilhaft, aber wie macht VB6 das, dasas es funktioniert, und was muss ich mit CSharp machen, damit ich auch wieder meine richtigen Bytes bekomme?

DANKEEEE
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 27.10.09 15:23 
Hallo und :welcome: im Forum!

user profile iconhvse hat folgendes geschrieben Zum zitierten Posting springen:
Mit Csharp bekomme ich immer die Folge 120,339,189
Das ist aber kein Bytewert, du liest also keine Bytes aus.

Wie liest du das denn aus? Ohne den Quelltext aus VB6 und deinem aktuellen in C# lässt sich da schlecht etwas dazu sagen... :zwinker:
hvse Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Di 27.10.09 16:22 
Ja, das ist richtig. Das sind 3 Bytes. Ich wollte nur eine kleine Bytefolge schreiben, da es ja theoretisch sein hätte können, dass es mehrere Bytes sind, die irgendwie zusammenhängen (wie z. B. bei UTF-8). Aber das ist nicht so, da hätte ich die beiden "außenrum"-Byte auch weglassen können ...

Ja, also in VB6 öffne ich ein Recordset und lese mit strDaten=CStr(rs!Daten) die Daten aus.

In CSharp öffne ich auch das Recordset (sowohl als SQLDataReader oder auch als OleDBDataReader), und hole mit string strDaten=oReader.GetValue(oReader.GetOrdinal("daten")) in meine Variable.

in VB6 kommt was anderes an (chr(156)) als in CSharp (chr(339)). Habe es jetzt mal sop gelöst: (Zur Erklärung: Da ich die Daten ans Internet weitergeben muss, brauche ich die Daten in einem Bytearray und muss sie irgendwie umwandeln. Mt den ganzen Encoding.XXX.YYY.GetBytes() oder was es alles gibt, gibt es immer irgendwo Sachen die haken...)

int vc=0;
char[] chararray = strDaten.ToCharArray();
byte[] byteArrayD = new byte[benötigte bytes]
for (int z = 0; z < chararray.Length; z++)
{
if (chararray[z] <= 255)
{
bytearrayD[vc] = (byte)chararray[z];
vc++;
} else {
string strTemp= char.ConvertFromUtf32(chararray[z]);
byte[] bytes= Encoding.Default.GetBytes(strTemp);
bytearrayD[vc] = bytes[0];
vc++;
}
}

Scheint soweit erstmal zu funktionieren, allerdings ist die Frage, warum VB& und CSharp die vorhandenen Daten anders interpretieren - und wie ich evtl gleich dem CSharp beibringen kann, dass es das richtig interpretieren soll ...

Danke Euch ;-))
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 27.10.09 17:52 
user profile iconhvse hat folgendes geschrieben Zum zitierten Posting springen:
Scheint soweit erstmal zu funktionieren, allerdings ist die Frage, warum VB& und CSharp die vorhandenen Daten anders interpretieren
Schau dir mal an, welches Zeichen #156 in Codepage 1252 (deutsch) und welches #339 in Unicode ist ;) ...

Encoding.Default ist dann schon das Mittel der Wahl, benutzt du ja auch schon, sollte aber problemlos auch direkt auf den gesamten String anwendbar sein :nixweiss: .

user profile iconhvse hat folgendes geschrieben Zum zitierten Posting springen:
Ich weiß, die Speicherung von binären Daten in NTEXT int nicht besonders vorteilhaft
Jupp :D

_________________
>λ=