Laden...

Byte basteln aus Nibbles

Erstellt von Falke2000 vor 8 Jahren Letzter Beitrag vor 8 Jahren 1.504 Views
F
Falke2000 Themenstarter:in
21 Beiträge seit 2015
vor 8 Jahren
Byte basteln aus Nibbles

Heya Leute,

Mein Auftrag hier ist es ein Byte zu erstellen und zwar aus einem gegeben String. Dieser String beinhaltet im Kontext eine Hexdezimalzahl. Ich möchte nun dieses Hex in mein Byte reinpappen.

Ich möchte keine Convert.ToByte() oder Substring Methode nutzen um das allocen im heap ein wenig geringer zu halten.

Demnach möchte ich einfach aus Nibbles ein Byte zusammen hauen.

Mein Problem zZt. ist es leider das ich nicht genau weiß wie ich nun ein Nibble dem Byte p_hex_value zuweise da es diesen Datentyp nicht gibt.
Ich müsste p_hex_value ja erstmal in (byte) casten oder mit Convert.ToByte() konvertieren. Wenn ich weiss wie ich den String-Inhalt bzw. den Char per Index_ in ein Byte packe ohne die oben genannten Vorgehensweisen, dann komme ich mit den Rest schon klar.

static void Main(string[] args)
		{
			String p_hex_string = "AFA700";
			Int32 byte_pos = 0;
			Byte[] hexByteArray = new Byte[p_hex_string.Length / 2];

			for (Int32 i = 0; i + 1 < p_hex_string.Length; i += 2)
			{
				Byte p_hex_value = p_hex_string[i];
                      // Byte-Bau Logik...

				hexByteArray[byte_pos] = p_hex_value;

				++byte_pos;
			}

			Console.Write(p_hex_string[0]);
			Console.WriteLine(p_hex_string[1]);
			
		}
F
10.010 Beiträge seit 2004
vor 8 Jahren

Wenn das immer Großbuchstaben sind, dann ist ein nibble ja immer entweder (byte)Zeichen - (byte)"0" oder (byte)Zeichen - (byte)"A"+10.
Die dann durch shiften zusammenzubauen sollte dann nicht mehr schwer sein.

Man kann auch z.b. ein Array of Char machen ( 0-9,A-F ) und die position drin suchen, ist aber deutlich langsamer.

5.657 Beiträge seit 2006
vor 8 Jahren

Hi FZelle,

Man kann auch z.b. ein Array of Char machen ( 0-9,A-F ) und die position drin suchen, ist aber deutlich langsamer.

Für diesen Anwendungsfall würde ich ein Dictionary<char, byte> vorziehen.

Christian

Weeks of programming can save you hours of planning

C
2.121 Beiträge seit 2010
vor 8 Jahren

Ein Dictionary macht aber auch gewisse Dinge im Hintergrund um einen Wert zu finden. Ich schätze da ist der Zugriff auf ein Array schon um einiges schneller.

Ich würde ein Array byte[255] erstellen und darin die Felder füllen:
[(byte)'0'] = 0;
...
[(byte)'A'] = 10;
[(byte)'a'] = 10;
und so weiter. Dann Zugriff mit dem als byte gecasteten char, da kommt man nicht drum herum. Aber das ist ja kein Aufwand.

185 Beiträge seit 2005
vor 8 Jahren

Du kannst die chars einfach Umrechnen:

Zahlen:


(byte)(hexDigit - 0x30);

Großbuchstaben:


(byte)(hexDigit - 0x57);

Kleinbuchstaben:


(byte)(hexDigit - 0x37);

dann die Bytes zusammensetzen:


 (byte)(Hexadecimal.ToByte(leftHexDigit) << 4 | Hexadecimal.ToByte(rightHexDigit));

Den String solltest du vorher Validieren.