Forum: PC-Programmierung Konvertierung c#


von Peter N. (jackybroun)


Lesenswert?

Hi,

tB_Test2.Text = ergebnis2;
variable_buffer = Convert.ToDecimal(tB_Test2.Text);

bei diesen beiden zeilen bekomme ich die Fehlermeldung, das der Wert zu 
groß oder zu klein ist.

In ergebnis 2 steht ein wert von zB. 1670265059 als String. 
variable_buffer ist ein decimal.

Wie kann man das problem lösen?

von Peter II (Gast)


Lesenswert?

Ich würde es mit Int32.parse vesuchen

http://msdn.microsoft.com/de-de/library/vstudio/b3h1hf19.aspx

von michael (Gast)


Lesenswert?

Was genau kommt denn da als Fehlermeldung?
Eine Exception?
Dein Zahlenwert ist auf jeden Fall noch wesentlich kleiner als 
Decimal.MaxValue. Es scheint also nicht daran zu liegen, dass dein Wert 
zu groß ist.

Was passiert denn, wenn du mal zum Spaß "0" in ergebnis2 reinschreibst?

Welchen Typ hat denn tB_Test2?

von Peter N. (jackybroun)


Lesenswert?

Habs mal geändert:

tB_Test2.Text = ergebnis2;
variable_buffer = Int64.Parse(tB_Test2.Text); <-- da kommt die 
fehlermeldung

Eine nicht behandelte Ausnahme des Typs "System.OverflowException" ist 
in mscorlib.dll aufgetreten.

Zusätzliche Informationen: Der Wert für einen Int64 war zu groß oder zu 
klein.

von Peter N. (jackybroun)


Lesenswert?

ergebnis2 = Convert.ToString(0);
tB_Test2.Text = ergebnis2;
variable_buffer = Int64.Parse(tB_Test2.Text);

So funktionierst, nur mein programmablauf stimmt nicht mehr xD

von Peter II (Gast)


Lesenswert?

Peter Naschke schrieb:
> Zusätzliche Informationen: Der Wert für einen Int64 war zu groß oder zu
> klein.

sicher das in tB_Test2.Text die wert 1670265059 steht?

von michael (Gast)


Lesenswert?

Nunja, auch Int64.Parse kann eine OverflowException werfen, sollte dies 
aber nur tun, wenn der geparste wert größer als Int64.MaxValue ist:

http://msdn.microsoft.com/de-de/library/vstudio/3b6b4bx3.aspx

Dein Wert ist jedoch kleiner als Int64.MaxValue:

9223372036854775807   (Int64.MaxValue)
1670265059            (dein Wert aus dem ersten Post)

Was GENAU steht in deinem String drin?

von michael (Gast)


Lesenswert?

Peter Naschke schrieb:
> ergebnis2 = Convert.ToString(0);

erbebnis2 = "0"; hätte es wohl auch getan

Lass doch mal den Wert von ergebnis2 auf die Konsole ausgeben. Das 
müsste so gehen:
Console.WriteLine(ergebnis2);

von Peter N. (jackybroun)


Lesenswert?

Ach misst sry ich brauche das als Binär und rechne das vorhe rin Binär 
um.

in steuerwort steht zB. 1670265059

ergebnis2 = Convert.ToString(steuerwort, 2);
tB_Test2.Text = ergebnis2;
variable_buffer = Int64.Parse(tB_Test2.Text);

das komische ist, das ich auch nicht das richtige binärergebnis bekomme

von Peter N. (jackybroun)


Lesenswert?

In ergbnis2 steht zB. 1000000000000000000000000011101

von michael (Gast)


Lesenswert?

Peter Naschke schrieb:
> 1000000000000000000000000011101

Klar, das funktioniert nicht, da
1000000000000000000000000011101 größer als
9223372036854775807

(.net weiß ja nicht, dass das oben eine Binärzahl ist)

Was willst du denn mit deinem Code erreichen?

von michael (Gast)


Lesenswert?

Gehts evtl damit:

http://msdn.microsoft.com/de-de/library/vstudio/1k20k614.aspx

public static int ToInt32(
  string value,
  int fromBase
)


variable_buffer = convert.ToInt32(ergbnis2,2);

???

von Arc N. (arc)


Lesenswert?

Peter Naschke schrieb:
> In ergbnis2 steht zB. 1000000000000000000000000011101

var res = Convert.ToInt32("1000000000000000000000000011101", 2);
http://msdn.microsoft.com/en-us/library/1k20k614.aspx

(zu spät...)

von Peter N. (jackybroun)


Lesenswert?

Ich brauche Die Int Variable mit dem Binärcode. Eine altanative wäre 
sonst den Binärcode beim wandeln auf 4 variablen aufzuteilen. Doch fällt 
mir grade keine sinnige lösung dafür ein

von Peter II (Gast)


Lesenswert?

Peter Naschke schrieb:
> Ich brauche Die Int Variable mit dem Binärcode

das geht doch ohne Problem. Man kann nur nicht ein Binärzahl noch mal 
als int parsen. (macht auch keinen Sinn!)

also beschreibe noch mal genau was dein Problem ist.

von Arc N. (arc)


Lesenswert?

Peter Naschke schrieb:
> Ich brauche Die Int Variable mit dem Binärcode. Eine altanative wäre
> sonst den Binärcode beim wandeln auf 4 variablen aufzuteilen. Doch fällt
> mir grade keine sinnige lösung dafür ein

???
Das was Convert.ToInt32(string, int) zurückliefert ist ein Int32. 
Binärer wird's nicht.
Braucht man die Einzelbytes kann man sich das selber mit >> und & 
zusammenbauen oder BitConverter.GetBytes nehmen.

von Peter N. (jackybroun)


Lesenswert?

Naja eigentlich brauche ich einen Int128 alles andere würde eine 
gewaltige arbeit nach sich ziehen. Mir kommen auch genug Ideen das 
aufzuteilen, dann stehe ich aber wieder am anfang weil ich alle 
schleifen umändern muss.

Für die weiterverarbeitung benötige ich den Binärcode auf einer Int 
variable

von Peter II (Gast)


Lesenswert?

Peter Naschke schrieb:
> Naja eigentlich brauche ich einen Int128

jetzt sagt doch mal um was es wirklich geht. Wozu braucht man solche 
großen Zahlen binär? Eventuell gibt es eine ganz andere Lösung die du 
aktuell nicht siehst.

von Arc N. (arc)


Lesenswert?

Peter Naschke schrieb:
> Naja eigentlich brauche ich einen Int128 alles andere würde eine
> gewaltige arbeit nach sich ziehen. Mir kommen auch genug Ideen das
> aufzuteilen, dann stehe ich aber wieder am anfang weil ich alle
> schleifen umändern muss.
>
> Für die weiterverarbeitung benötige ich den Binärcode auf einer Int
> variable

Nochmal auf Start: Was geht rein, was soll rauskommen?
So wie es bislang aussieht, soll von String nach irgendwas gewandelt 
werden.
1. Wie lang ist der String?
2. Was steht da genau drin?
3. In was soll das umgewandelt werden?
4. Was soll mit dem umgewandelten gemacht werden?

von Peter N. (jackybroun)


Lesenswert?

naja ich brauche am ende des programms den int wert aus steuerwort auf 4 
byte variablen in binärcode aufgeteilt, um sie über die serielle 
schnittstelle als byte zusenden.

in steuerwort steht etwas mit 10stellen, was aus einer berechnung kommt

von Arc N. (arc)


Lesenswert?

Peter Naschke schrieb:
> naja ich brauche am ende des programms den int wert aus steuerwort auf 4
> byte variablen in binärcode aufgeteilt, um sie über die serielle
> schnittstelle als byte zusenden.

Dazu steht die Lösung schon oben:
var res = Convert.ToInt32(string, int);
var bytes = BitConverter.GetBytes(res);
sp.Write(bytes, 0, bytes.Length);

von Peter II (Gast)


Lesenswert?

Peter Naschke schrieb:
> naja ich brauche am ende des programms den int wert aus steuerwort auf 4
> byte variablen in binärcode aufgeteilt, um sie über die serielle
> schnittstelle als byte zusenden.

warum zum geier sollte man über die Serielle schnittstelle nur 0 oder 1 
senden? kannst du es nicht als hex übertragen?

Kann es eventuell sein das du es doch nicht als 0 oder 1 übertragen 
sollst. Sonder als 3 bytes?`

also die zahl  123456789 übertragen als 0x07,0x5B, 0xCD, 0x15. Dafür 
braucht die ganze konvertiert nicht. Das geht komplett anders.

von Peter N. (jackybroun)


Lesenswert?

Wenn ich die Konvertierung hier nicht mache muss ich sie auf der Platine 
machen.Die Software auf der Platine ist fertig und läuft super.

Dazu steht die Lösung schon oben:
var res = Convert.ToInt32(string, int); <--Das lisst man so häuft aber 
ich bekomme immer ne fehlermeldung wenn ich für in zb. 2 einsetze.

var bytes = BitConverter.GetBytes(res);

sp.Write(bytes, 0, bytes.Length);

von Peter II (Gast)


Lesenswert?

Peter Naschke schrieb:
> Wenn ich die Konvertierung hier nicht mache muss ich sie auf der Platine
> machen.Die Software auf der Platine ist fertig und läuft super.

du hast uns immer noch nicht gesagt was du übertragen willst.

willst du 0 und 1 übertragen?

mache uns doch mal ein Beispiel was genau du auf die Leitung schicken 
willst.

von Peter N. (jackybroun)


Lesenswert?

01101010
10101010
10101010
10101010

die 4 bytes nnacheinander habe ich auch als Testvariablen und erzeugen 
mir am ausgang der Platine genau das wa sich erwarte.

von Peter II (Gast)


Lesenswert?

Peter Naschke schrieb:
> die 4 bytes nnacheinander habe ich auch als Testvariablen und erzeugen
> mir am ausgang der Platine genau das wa sich erwarte.

also willst du 4 bytes übertragen und brauchst überhaupt keine bits.

Dann reicht doch wohl

byte[] bytes = BitConverter.GetBytes(i);


was willst du dann noch mit Convert.ToInt32?

von Peter N. (jackybroun)


Lesenswert?

01101010
10101010
10101010
10101010

das sind bynärcode gefüllte bytes, genau das was ich brauche. Bei byte[] 
bytes = BitConverter.GetBytes(i); stehen in bytes doch wieder 4 Dezimale 
Zahlen die jeweils 1 byte groß sind?

von Peter II (Gast)


Lesenswert?

Peter Naschke schrieb:
> das sind bynärcode gefüllte bytes, genau das was ich brauche. Bei byte[]
> bytes = BitConverter.GetBytes(i); stehen in bytes doch wieder 4 Dezimale
> Zahlen die jeweils 1 byte groß sind?

irgendwie reden wir aneinander vorbei. in den Bytes steht keine 4 zahlen 
sondern 8bit mit der Dezimaldarstellung von 0-255.

Wie sollen denn in einem Byte 4 Zahlen stehen? Dort steht genau eine 
Zahl und die geht von 0-255 nur wenn man es für den Mensch ins 
Dezimalsystem umrechnet stehen dort 3 Ziffern.

Wenn du 4 Byte übertragen willst/muss, dann übertrage doch einfach diese 
4 Bytes.

von Peter II (Gast)


Lesenswert?

kannst du uns mal den teil vom Empfänger zeigen wo du die Daten 
verarbeitest? Daran sollte man sehen in welcher Form du die Daten 
wirklich brauchst.

von dggg (Gast)


Lesenswert?

Das sollte nicht nötig sein

Man müsste sich nur mal darüber Gedanken machen in welcher form daten 
abgelegt sind und wie sie interpretiert werden können.

Man nehme die Zahl 64 (10)

sie repräsentiert für uns zunächst einen dezimalen Wert.

Im pc werden, egal welcher datentyp verwendet, Binär 0100 000 draus.
In ascii wird ein 'A' für die ausgabe draus.
in jedem anderen Datentyp der größer als ein byt lang ist werden führend 
einfach nur nullen angehängt.

ein int16 also 0000 0000 0100 0000
ein int32 also 0000 0000 0000 0000 0000 0000 0100 0000

wenn du einen string mit dem inhalt "64" nach int parst,
hast du also diesen wert im speicher nach obigen muster abgelegt.

von Peter N. (jackybroun)


Lesenswert?

Also mein Problem ist das ganz einfach die anführenden nullen nicht über 
tragen werden. Wenn ich 00110000 habe, bekomme ich auf der anderen seite 
110000 an. Damit funktioniert nichts mehr.

Ich brauche eigentlich eine Methode wie sowas hier:

serialPort1.Write(bytes, 0, 1).PadLeft(8, '0')

Das Bsp. funktioniert natürlich nicht

von Peter II (Gast)


Lesenswert?

Peter Naschke schrieb:
> Also mein Problem ist das ganz einfach die anführenden nullen nicht über
> tragen werden. Wenn ich 00110000 habe, bekomme ich auf der anderen seite
> 110000 an. Damit funktioniert nichts mehr.

nein, dein Problem ist immer noch das du uns nicht mal sagen kann wie 
genau du etwas übertragen willst. Was soll dein 00110000 sein? Ein 
String?

Bei Serial werden immer 8 bits übertragen, da kann nichts abgeschnitten 
werden, bits können nur 0 oder 1 sein.

> serialPort1.Write(bytes, 0, 1).PadLeft(8, '0')

was soll das denn darstellen? Was soll denn daas PadLeft bewirken?

Zeige doch mal den code wie du an der gegenstelle die Daten empfängst, 
wenn du es schon nicht erklären kannst wie du die die übertragen willst.

von dggg (Gast)


Lesenswert?

Er meint wahrscheinlich, wenn er aus dem String eine zahl castet und 
daraus wieder einen String mit dem wert zur Basis 2 fehlen ihm die 0en 
vorne.

Dabei müsste er nur mal die BitConverter.GetBytes() Funktion 
ausprobieren und das Ergebnis auf die Console ausgeben, dann würde er 
genau das haben was er will, er kann sich nur nicht vorstellen dass die 
zahlen die er da sieht intern bits sind, und als bytes ganz normal 
übertragen werden.

von Peter N. (jackybroun)


Lesenswert?

Hi also nein, das problem ist folgendes:

bytes = BitConverter.GetBytes(steuerwort);

wenn ich die bytes jetzt übertrage mit der serialwrite byte methode dann 
werden anscheinend Dezimalwerte übertragen oder mir fehlt die anführende 
0.

Eins von beiden muss sein denn wenn ich mir bytes schreibe mit int fülle 
und mit bit.converter carste und übertrage funktioniert alles.

Wenn ich  tB_Test2.Text = Convert.ToString(bytes[3], 2); benutze bekomme 
ich mein byte mit den 01000000 zB. weil ich den string zu basis 2 hin 
ausgebe. Wenn ich aber jetzt die Basis weg lasse, dann bekomme ich int. 
Eine weitere Frage die ich habe ist daher, wird beim Carsten in string 
standartmäßig zur basis 10 gecastet?

von Peter II (Gast)


Lesenswert?

Peter Naschke schrieb:
> wenn ich die bytes jetzt übertrage mit der serialwrite byte methode dann
> werden anscheinend Dezimalwerte übertragen oder mir fehlt die anführende
> 0.

nein das passiert auf keinen Fall, es werden wirklich bytes übertragen.

Warum prüft du nicht einfach mal was wirklich übertragen wird?

http://msdn.microsoft.com/en-us/library/ms143551.aspx

Peter Naschke schrieb:
> Eine weitere Frage die ich habe ist daher, wird beim Carsten in string
> standartmäßig zur basis 10 gecastet?

es gibt kein casten nach string, nur eine convertierung.

von Peter N. (jackybroun)


Lesenswert?

Ich habs ausprobiert, und es funktioniert nicht. Wenn ich testvariablen 
schreibe funktioniert es einwandfrei.

sry ich meine string convertierung

von Peter II (Gast)


Lesenswert?

Peter Naschke schrieb:
> Ich habs ausprobiert, und es funktioniert nicht.

dann finde doch erstmal raus, was nicht funktioniert. Du vermutest immer 
nur. Kann du nicht einfach auf der gegenstelle dir anzeigen lassen was 
empfangen wird? Oder also Echo zurückschicken? Oder mit dem Oszi die 
Leitung mitlesen. Oder per Software (z.b.SerialPortMonitor) prüfen. Oder 
mit com2com eine Virtuelle schnittselle anlegen und dann dir die Daten 
anzeigen lassen.

von Markus V. (valvestino)


Lesenswert?

Peter Naschke schrieb:
> Wenn ich die Konvertierung hier nicht mache muss ich sie auf der Platine
> machen.Die Software auf der Platine ist fertig und läuft super.

Wie wäre es denn, wenn Du endlich mal ein Stück Code von der 
Empfängerseite postest, damit man mal sehen kann, in welchem Format die 
Daten erwartet werden. Dann kann Dir auch im Handumdrehen geholfen 
werden.

Ich habe so den Eindruck als ob hier jede Menge aneinander vorbei 
gepostet wird. %-)

Grüße
Markus

von Arc N. (arc)


Lesenswert?

Peter Naschke schrieb:
> Also mein Problem ist das ganz einfach die anführenden nullen nicht über
> tragen werden. Wenn ich 00110000 habe, bekomme ich auf der anderen seite
> 110000 an. Damit funktioniert nichts mehr.
> Ich brauche eigentlich eine Methode wie sowas hier:
>
> serialPort1.Write(bytes, 0, 1).PadLeft(8, '0')
>
> Das Bsp. funktioniert natürlich nicht

Dann wird versucht die Bytes als String/Text zu übertragen oder irgend 
etwas läuft völlig anders als auf normalen Computern.

Beispiel:
1
// Ein Text, woher auch immer, wird umgewandelt in einen Integer.
2
// Einmal ist der Text die Dezimaldarstellung, einmal die Binärdarstellung
3
var text1 = "1234";
4
var result1 = Convert.ToInt32(text1, 10);
5
var testFlag1 = result1 == 1234;
6
7
var text2 = "10011010010";
8
var result2 = Convert.ToInt32(text2, 2);
9
var testFlag2 = result2 == 1234;
10
11
// wird jetzt das Ergebnis result1 oder result2 mit BitConverter 
12
// umgewandelt in einzelne Bytes und per serialPort.Write übertragen
13
var bytes = BitConverter.GetBytes(result1);
14
serialPort.Write(bytes, 0, bytes.Length);
15
// kommen auf der Gegenseite vier Bytes an (0xd2, 0x04, 0x00, 0x00) 
16
// Wie zu sehen, sind die Little-endian.
17
18
// Wenn die Gegenseite Big-endian braucht, können die Bytes entweder
19
// vor dem Senden umgedreht werden z.B.
20
var bigEndianBytes = bytes.Reverse().ToArray();
21
// oder dies kann vor dem Umwandeln in ein Byte-Array geschehen
22
var bigEndianResult = System.Net.IPAddress.HostToNetworkOrder(result1);
23
var bytes2 = BitConverter.GetBytes(bigEndianResult); 
24
25
// Soll bspw. result2 als Text übertragen werden, dann kann 
26
// z.B. result2 mit
27
var textResult = Convert.ToString(result2, 2).PadLeft(32, '0');
28
// in einen 32-Zeichen langen (keinen 32 Bytes langen!) Text umgewandelt werden
29
// Soll das Array bytes2 mit den vier Bytes in vier Strings mit der 
30
// Binärdarstellung umgewandelt werden, 
31
var textResult4_8 = bytes2.Select(x => Convert.ToString(x, 2).PadLeft(8, '0')).ToArray();
32
// Ausgeschrieben wäre letzteres z.B.:
33
string[] textResult4_8_2 = new string[bytes2.Length];
34
for (int i = 0; i < bytes2.Length; i++ ) {
35
    textResult4_8_2[i] = Convert.ToString(bytes2[i], 2).PadLeft(8, '0');
36
}
37
38
// u.U. das Encoding des SerialPorts umstellen, damit nicht nur 7-Bit
39
// ASCII auf der Gegenseite ankommt
40
serialPort.Encoding = Encoding.GetEncoding(28591);

von Peter N. (jackybroun)


Lesenswert?

Der fehler war ein dreher bei den Bytes, sry und danke an alle :D. Wenn 
ich noch aufräumen will, wie sieht dann der eigene methodenaufruf aus?

public void machwas(object sender)
{
     zahl = 1+1
}

...

private void button2_Click(object sender, EventArgs e)
{
     machwas();
     textBox1.Text = ConverToString(zahl);
}

von Max T. (charmquark)


Lesenswert?

Wieso solltest Du denn überhaupt die Bytes als Text über die 
Schnittstelle schicken, statt das Byte direkt zu schicken? Deine "0" 
oder "1" werden doch sowieso als je ein ganzes Byte verschickt, d.h.
0 -> 00000000
1 -> 00000001
Der Controller muss also auch acht mal so viel empfangen und 
verarbeiten. Dann wäre es doch viel geschickter das Byte so wie es ist 
über die Schnittstelle zu schicken und auf dem Controller (falls das 
überhaupt nötig sein sollte) auseinander zu nehmen.

Die Prozeduraufrufe würden laufen, wenn du das "object sender" der 
Funktion "machwas" weglassen würdest. Es ist allerdings eine äusserst 
schlechte Art solche Funktionen direkt globale Variablen wie "zahl" 
ändern zu lassen. Besser wäre etwa eine Funktion wie
1
private int machwas( int zahl )
2
{
3
  zahl = zahl + 1;
4
  return zahl;
5
}

(mal ausgeschrieben), die einen Parameter und einen Rückgabewert hat. 
Diese kann dann aufgerufen werden mit
1
neuezahl = machwas(altezahl);

Sch;ne Grüße,
Max

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.