Autor |
Beitrag |
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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
C#-Quelltext 1: 2: 3: 4:
| float result = BitConverter.ToSingle(deinLiebesByteArray, 0); string result = Encoding.UTF8.GetString(deinLiebesByteArray); |
|
|
m.keller 
      
Beiträge: 133
Win xp, Win 7
C# (VS 2008)
|
Verfasst: 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
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mo 24.02.14 12:53
Welchen String-Wert erwartest du denn bei 0x000007E6?
|
|
m.keller 
      
Beiträge: 133
Win xp, Win 7
C# (VS 2008)
|
Verfasst: 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
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mo 24.02.14 13:09
Das wäre einfach der Integerwert. Also nix Float oder string.
|
|
m.keller 
      
Beiträge: 133
Win xp, Win 7
C# (VS 2008)
|
Verfasst: 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
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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 
      
Beiträge: 133
Win xp, Win 7
C# (VS 2008)
|
Verfasst: 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!
Quelltext 1: 2: 3:
| 0x33382C303030 0x33392C303030 0x00009C4000009C4000009C4000009C4000009C4000009C4000009C4000009C4000009C4000009C4000009C4000009C4000009C4000009C4000009C4000009C400000 |
das sind Werte von drei Zeilen.
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
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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
SQL-Anweisung 1: 2:
| Declare @data varbinary(max) = 0x000007E6 select cast(@data as varchar(max)) as [varchar], cast(@data as int) as [int], cast(@data as datetime) as [datetime] |
liefert
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 
      
Beiträge: 133
Win xp, Win 7
C# (VS 2008)
|
Verfasst: 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
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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 
      
Beiträge: 133
Win xp, Win 7
C# (VS 2008)
|
Verfasst: 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 
      
Beiträge: 133
Win xp, Win 7
C# (VS 2008)
|
Verfasst: Mo 24.02.14 15:44
SQL-Anweisung 1: 2: 3: 4: 5:
| SELECT [VALUE] ,cast([VALUE] as Varchar(max)) FROM [Data]
where ResultID = 22 |
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 
      
Beiträge: 133
Win xp, Win 7
C# (VS 2008)
|
Verfasst: 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
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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 
      
Beiträge: 133
Win xp, Win 7
C# (VS 2008)
|
Verfasst: 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
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
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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 
      
Beiträge: 133
Win xp, Win 7
C# (VS 2008)
|
Verfasst: 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
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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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 
      
Beiträge: 133
Win xp, Win 7
C# (VS 2008)
|
Verfasst: 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)
|
|