Autor Beitrag
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 24.02.14 12:35 
Bei string gilt weiterhin das über die Encoding Klasse zu machen. Wieviele Bytes das sind macht keinen Unterschied. Der Zieltext hat halt nur eine andere Länge.
Float über BitConverter.ToSingle

ausblenden C#-Quelltext
1:
2:
3:
4:
// float
float result = BitConverter.ToSingle(deinLiebesByteArray, 0);
// string
string result = Encoding.UTF8.GetString(deinLiebesByteArray);
m.keller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Mo 24.02.14 12:50 
Danke.

Wenn ich den String auswerte, bekomme ich allerdings nur "\0\0\a�" raus, der Wert des varbinary Feld ist 0x000007E6.
Dass kann doch dann auch nicht stimmen.

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)


Zuletzt bearbeitet von m.keller am Mo 24.02.14 13:10, insgesamt 1-mal bearbeitet
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 24.02.14 12:53 
Welchen String-Wert erwartest du denn bei 0x000007E6?
m.keller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Mo 24.02.14 13:01 
Laut Zulieferer sollte es 2022 sein. Angeblich 32 bit hex.

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 24.02.14 13:09 
Das wäre einfach der Integerwert. Also nix Float oder string.
m.keller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Mo 24.02.14 13:12 
naja an sich ja.
Laut Zulieferer, hat er diesen wert in ein String konvertiert und diesen dann in ein varbinary eingetragen. Es kann dort auch ein String von einem Datum enthalten sein.
"0x000007E6" muss Komplet betrachtet werden! Wenn ich den String den ich raus bekommen habe interpretiere, wurde 00 zu 0 konvertiert und 07 zu a un E6 zu einem unbekannte Zeichen.

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 24.02.14 14:23 
Zitat:
"0x000007E6" muss Komplet betrachtet werden! Wenn ich den String den ich raus bekommen habe interpretiere, wurde 00 zu 0 konvertiert und 07 zu a un E6 zu einem unbekannte Zeichen.


Nein. utf-8 hat keine fixe Zeichenlänge. Jedes Zeichen ist zwischen 1 und 4 Byte lang und nicht 1 Byte = 1 Zeichen. Da das hier aber sicher kein string ist könnte es trotzdem zufällig so auskommen wie du denkst es bleibt aber Müll. Falls du das nicht glaubst dann bedenke auch eins gilt bei utf-8, jedes Zeichen wird immer gleich kodiert. Wenn es also 2022 als Zeichenfolge wäre sollte da 3 mal die selbe ByteFolge auftauchen was es doch wohl ganz offensichtlich nicht tut.

7E6 ist die Hex Darstellung von 2022 dezimal. Kannst du mit jedem Taschenrechner nachrechnen. Kriegt sogar der von Windows hin. Deine Bytefolge die du da hast ist die direkte Integerdarstellung von 2022.
m.keller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Mo 24.02.14 14:41 
Es ist ein Int wert der aber als Text ausgegeben werden soll.
Das Problem ist das eine Zeile weiter ein Datum drin stehen kann,in der nächsten Zeile ein normaler text und in der dann darauf folgenden ein Hex-String.
Wenn ich mit dem View in der Datenbank die Werte mit cast(varbinaryWert as varchar(max)) auslese dann bekomme ich die gewünschten werte.
Dieses wäre aber fatal wenn ich ein Hex-String mit 8000 Zeichen auslesen will. Dies kann er nicht umwandeln!

ausblenden Quelltext
1:
2:
3:
0x33382C303030
0x33392C303030
0x00009C4000009C4000009C4000009C4000009C4000009C4000009C4000009C4000009C4000009C4000009C4000009C4000009C4000009C4000009C4000009C400000

das sind Werte von drei Zeilen.
ausblenden Quelltext
1:
2014/02/21_13:23:12  0x323031342F30322F32315F31333A32333A3132					

von einer vierten mit dem Richtigen Wert

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 24.02.14 15:04 
Zitat:
Es ist ein Int wert der aber als Text ausgegeben werden soll.

Also Byte[] mit Bitconverter.ToInt32 in einen Integer wandeln und dann nach string casten.
Zitat:
Wenn ich mit dem View in der Datenbank die Werte mit cast(varbinaryWert as varchar(max)) auslese dann bekomme ich die gewünschten werte.

Nach dem was du uns erzählt hast bezweifle ich das. Kurzer Test
ausblenden SQL-Anweisung
1:
2:
Declare @data varbinary(max) = 0x000007E6
select cast(@data as varchar(max)) as [varchar], cast(@data as intas [int], cast(@data as datetime) as [datetime]

liefert
ausblenden Quelltext
1:
2:
varchar  int      datetime
         2022     1900-01-01 00:00:06.740

Da da 0er Bytes stehen werden die wahrscheinlich als Textende interpretiert und als varchar bekommst du gar nix bei 0x000007E6.
m.keller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Mo 24.02.14 15:32 
0x000007E6 liefert bei Varchar(max) die 2022

der andere Wert ist das Datum.

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 24.02.14 15:37 
Zitat:
0x000007E6 liefert bei Varchar(max) die 2022


Dann ist dein Wert bereits ein Int und kein Varbinary. Wäre es tatsächlich ein Varbinary würdest du die 2022 nicht bekommen. Du sprachst eben in einem Nebensatz von einem View. Konvertiert der eventuell schon bevor du auch noch Hand anlegst?
m.keller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Mo 24.02.14 15:39 
Nein nur wenn ich den view bearbeite und cast(varbinaryWert as varchar(max)) eintrage.

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
m.keller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Mo 24.02.14 15:44 
ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
SELECT [VALUE]
      ,cast([VALUE] as Varchar(max))
  FROM [Data]

where ResultID = 22


ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
0x48616C6C6F2057656C74  Hallo Welt
0x33363230303030303030313733303431  3620000000173041
0x0000041100000412000004130000041400000415000004160000041700000418000004190000041A0000041B0000041C0000041D0000041E0000041F0000042000
0x000007D7  
0x000007D8  
0x000007D9  
0x000007DA


Mit dem SQL befehl bekomme ich die daten angezeigt.
Die ersten beiden Werte habe ich für Testzwecke geändert.
Die unteren werden gar nicht erst ausgegeben.

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
m.keller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Mo 24.02.14 17:07 
wir weichen aber gerade von der eigentlichen Frage ab.
Ich bekomme aus der Datenbank das varbinary Feld leider nur mit einem Reader als byte[] ausgelesen.
Wie kann ich dieses direkt in einen string schreiben?

Und für die anderen Werte, wie kann ich diese umwandeln, in ein String?

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 24.02.14 17:16 
Zitat:
Ich bekomme aus der Datenbank das varbinary Feld leider nur mit einem Reader als byte[] ausgelesen


Nicht leider sondern zwangsweise. Alles ist binär nur in dem man sagt "interpretiere mir das als Integer, Float, String mit den entsprechenden Regeln" kommt am Ende was sinnvolles raus (bei der Wahl der richtigen Regeln). Dafür gibt es ja unterschiedliche Datentypen in der Datenbank (und in Programmiersprachen etc.) damit man weiß wie die Bitfolgen zu interpretieren sind und das Automatisch richtig interpretiert werden kann. Wenn du das in der Datenbank typfrei (als irgendein Binärtyp) ablegst bist du der Einzige der sagen kann wie das zu interpretieren ist und mußt dann auch die entsprechenden Regeln einhalten.

Zitat:
Und für die anderen Werte, wie kann ich diese umwandeln, in ein String?


Da drehen wir uns jetzt im Kreis. Du mußt erst wissen was es ist. Dann mußt du das in diesen Typ ändern und dann in einen String (wenn es nicht eh schon ein string passender Encodierung war).
Also wenn du weißt das es ein Integer ist (wie bei dem 7E6 zu 2022 Ding) mußt du die Bytes in Integer ändern und dann den Integer in einen String.
m.keller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Di 25.02.14 12:23 
Ich versuche es jetzt mit einer Sache bzw Frage.
Ich muss einen Binär String auslesen diese beträgt im normal Fall 4069 Byte.
wenn ich wie ihr das vorgeschlagen habt
ausblenden C#-Quelltext
1:
byte[] binaryData = (byte[])reader["array"]					

bekomme ich die gleichen werte wie als wenn ich den Reader mir angucke.
D.h. ich bekomme lauter zahlen werte, keine Hex.
Ich muss diesen langen Binär string aber als Hex in einem String übergeben.
Wenn das erst ein mal Funktioniert, dann bin ich ein großen Schritt weiter

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 25.02.14 12:42 
Hallo,

um diesen Thread mal zum Abschluß zu bringen, solltest du mal etwas konkreter werden.
Was genau möchtest du als Stringausgabe haben - gib mal ein Beispiel (ich glaube immer noch, daß dir die Grundlagen von Datentypen nicht klar sind, wenn ich so deine Formulierungen bzgl. "D.h. ich bekomme lauter zahlen werte, keine Hex." lese...).
m.keller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Di 25.02.14 12:49 
Also noch mal kurz, ich lese z.B. ein varbinary Feld mit dem Wert den mir MSSQL anzeigt "0x00009ccA".
Wenn ich mir die Daten in c# im Debug angucke, bekomme ich 4 byte mit den werten {0;0;156;202}

Mit
ausblenden C#-Quelltext
1:
string.Format("{0:X}", readerNew.ReadByte()					

Bekomme ich leider nur "009ccA"raus eigentlich müsste er daraus ein Ergebnis machen wie oben.
Warum kann er die ersten 00 nicht in ascii interpretieren?

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 25.02.14 13:45 
ReadByte liefert nur ein einzelnes Byte zurück, da passt also schon irgendwas nicht ...

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
m.keller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Di 25.02.14 13:47 
wird in einer schleife aufgerufen biss alle Bytes gelesen worden sind.

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)