Laden...

int nach byte[] Array

Erstellt von martin_zi vor 17 Jahren Letzter Beitrag vor 17 Jahren 6.228 Views
M
martin_zi Themenstarter:in
134 Beiträge seit 2006
vor 17 Jahren
int nach byte[] Array

Hallo

Ich will gerne ein int nach in ein byte[] Array übertragen.
Leider stehe ich jetzt voll auf der Leitung X( ... 🤔

Ein int ist ja 32 bit ich will dann das im byte[] Array der int dann zu finden ist.

Also als Beispsiel wenn
int x= 5;

dann soll im byte[] Array
byte[] data = new byte[3];

data[0] = 0
data[1] = 0
data[2] = 0
data[3] = 5
stehen ... habe irgndwas was kleiner ist als 16 genommen um mir eine
Umrechnung zu ersparen ...

und ich will natürlich auch den umgekehrten weg angehen ...
Wie macht man sowas denn in C# ?
und Wie kann ich auf die einzelnen Byteadressen zugreifen ?

mfg martin

184 Beiträge seit 2005
vor 17 Jahren

Hi,


int x = 5;
byte[] data = BitConverter.GetBytes(x);

Gruß
DCoder

M
martin_zi Themenstarter:in
134 Beiträge seit 2006
vor 17 Jahren

Hi

Danke ...
Aber bin immer noch auf wackligem Boden.

was mach ich denn wenn ich z.b

byte[] data = new byte[32];

in den ersten vier will ich z.b "5" in den nächsten vier "6" will ich sechs schreiben.
🤔

wie kann ich mit einem byte Array richtig handieren ? Das ist mir noch nicht ganz klar....

mfg martin

B
1.529 Beiträge seit 2006
vor 17 Jahren

BitConverter.GetBytes liefert dir ein Array. Daher kannst du auch dessen Mehtoden benutzen: BitConverter.GetBytes( x ).CopyTo( destination, startindex ).

184 Beiträge seit 2005
vor 17 Jahren

Was willst du denn genau damit machen?

Im Prinzip hast du ja einfach ein byte array und kannst damit ganz "normal" arbeiten. Wenn du jetzt 2 int werte nacheinander in einem byte array stehen haben willst, könntest du dir manuell das byte array zusammen bauen (mit Hilfe des BitConverters).

Aber beschreib am besten mal lieber was du eigentlich vor hast, dann kommt vielleicht die beste lösung viel schneller ans Licht 😉

M
martin_zi Themenstarter:in
134 Beiträge seit 2006
vor 17 Jahren

Hi

Nunja ich will ein int Array sozusagen in ein ByteArray kopieren. (ohne verluste)

Das von Borg sieht gut dafür aus ... 😉

Hmm hab mich wohl zu früh gefreut oder bin verwirrt weil ein void zurück gegeben wird ? 🤔

mfg martin

184 Beiträge seit 2005
vor 17 Jahren

Dann musst du wohl ein großes byte array anlegen (bei int, einfach die anzahl der element * 4) und dann für jedes int die bytes vom BitConverter in das große byte Array packen.

Die Methode CopyTo liegt in der Klasse Array, und da dir BitConverter.GetBytes() ja ein Array zurückliefert, kannst du dann natürlich auch direkt CopyTo aufrufen. mit dem Index gibst du jetzt an wo in dem großen array der neue satz an daten reinkommen soll -- am besten einen zähler mitlaufen lassen, der die anzahö der bisher geschriebenen bytes zurückgibt. dieser zähler ist dann dein index.

M
martin_zi Themenstarter:in
134 Beiträge seit 2006
vor 17 Jahren

Hi

Hmm Danke erstmal
Ich spiel damit mal herum.
Und wie kann ich einen Stream ? in ein byte Array kopieren ?

Gibt es eigentlich auch die Möglichkeit das Int Array als ByteArray darzu stellen ?
Ohne das ich das kopieren muss ?

mfg Martin.

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo martin_zi,

Und wie kann ich einen Stream ? in ein byte Array kopieren ?

einfach mit Stream.Read.

Gibt es eigentlich auch die Möglichkeit das Int Array als ByteArray darzu stellen ? Ohne das ich das kopieren muss ?

Nein!

herbivore

E
265 Beiträge seit 2004
vor 17 Jahren

Man kann das ganze auch ohne BitConverter machen. Gefällt mir persönlich besser.


int num = 10;
byte[] buffer = new byte[ num * sizeof( int ) ]
int[] vals = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };

int pos = 0;
for( int i = 0; i < num; i++ )
{
	buffer[ pos++ ] = (byte)((byte)(vals[0] >> 0) & (byte)0xFF);
	buffer[ pos++ ] = (byte)((byte)(vals[0] >> 8) & (byte)0xFF);
	buffer[ pos++ ] = (byte)((byte)(vals[0] >> 16) & (byte)0xFF);
	buffer[ pos++ ] = (byte)((byte)(vals[0] >> 24) & (byte)0xFF);
}

M
martin_zi Themenstarter:in
134 Beiträge seit 2006
vor 17 Jahren

Hallo

D.h z.b so

byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, stream.Length);

Wobei stream der Stream ist vorher initalisiert und irgendwo her.

Ok ich hab das jetzt in der msdn gefunden richtig!

Ein Bytearray. Nach dem Beenden dieser Methode enthält der Puffer das angegebene Bytearray mit den Werten zwischen offset und (offset + count - 1), die durch aus der aktuellen Quelle gelesene Bytes ersetzt wurden.

Aber jetzt verstehe ich wohl etwas Grundlegendes nicht.
Wie kann denn in dem Array bytes was sein ?
Ich meine müsste ich die Methode nicht mit "call by reference" übergeben ?
Das heißt doch ich müsste das Schlüsselwort ref nutzen aber die Methode verlangt das
ja gar nicht ? 🤔 🤔 🤔
Daher habe die Methode übersehen da kein ref oder out steht.
Offenscihtlich ist das nicht so ...

ich habe mir gerade das durchgelesen
C# und Übergabemechanismen: call by value vs. call by reference (ref/out)
aber offensichtlich nicht ganz verstanden X(

mfg Martin

184 Beiträge seit 2005
vor 17 Jahren

@EvilTK
Deine Lösung find ich persönlich auch besser -- aber in deiner schleife müsste statt vals[0] glaub ich vals_ stehen, oder?

Gruß
DCoder

E
265 Beiträge seit 2004
vor 17 Jahren

@DCoder stimmt, fehler meinerseits.

@martini_zi Arrays sind Referenz typen und werden somit immer call-by-reference übergeben.

M
martin_zi Themenstarter:in
134 Beiträge seit 2006
vor 17 Jahren

Ach so ist das =)

Danke für die Antworten 😁

mfg Martin