2016-12-19 3 views
1

Ich habe zwei Hex-Strings mit 8 Ziffern. Ich muss für diese zwei hexadezimale Zeichenfolge anwenden und operieren, dann wenden Sie die rechte Verschiebung auf 7 Bits an und erhalten den Dezimalwert. Ich habe versucht, Hex-Strings in Byte-Array der Länge 4 (8 * 2 = 32 Bits = 4 Bytes) zu konvertieren und & Operation zu einzelnen Bytes in der gleichen Reihenfolge, gespeichert das Ergebnis zu einem anderen Byre-Array der Länge 4. Wie Bit Shifting zu tun zu diesem Byte-Array?Rechtsverschiebung in Byte-Array

Ex : data1 in hex: 0x40003019, 
    data1 in bits: 0100-0000 0000-0000 0011-0000 0001-1001, 
    data1 in bytes: 64 0 48 25, 
    data2 in hex: 0x00FFFF80, 
    data2 in bits : 0000-0000 1111-1111 1111-1111 1000-0000, 
    data2 in bytes : 0 255 255 128 

UND-Operation zwischen data1Bytes, data2Bytes dem Ausgang ergibt: bytearray1 [0,0,48,0] (Bits für diesen 0000-0000 0000-0000 0000-0000 0.011-0.000 und Dezimalwert ist 12.288).

Bis zu diesem Schritt funktionieren alle meine Konvertierungen und Berechnungen wie erwartet. jetzt muss ich 7 Bits dieses Endergebnisses nach rechts verschieben, was 0000-0000 0000-0000 0000-0000 0110-0000 (Dezimalwert von 96) ergeben sollte.

1) Ich habe versucht Bytedatenfeld Umwandeln Verschiebung nach rechts in int und anwenden

var res = BitConverter.ToInt32(bytearray1, 0); 
var shift = res >> 7; 

aber res = 3145728 (was 12,228 sein sollte) und Shift = 24.576 (was 96 sein sollte)

2) ich habe müde Umwandlung bytearray1 [0,0,48,0] in BitArray aber in Bits resultierenden BitArray in umgekehrter Reihenfolge

var bitArray = new BitArray(bytearray1); 

BitArray [0] ... BitArray [19] = false, BitArray [20 ] = bitArray [21] = wahr, bitArray [22] ... bitArray [31] = falsch.

BitArray [0] ----------- [31]: 0000 0000 0000 0000 0000 1100 0000 0000,

Bit Dieses Ergebnis falschen Wert verschiebt. Bitte hilf mir dabei, was mir fehlt?

+1

Sie sagen "Right-Shift", aber Ihr Beispiel Links-Shift von 00110000 bis 01100000. Was ist richtig? Vielleicht müssen Sie einfach '>>' durch '' '' ... ersetzen –

+0

@MatthewWatson Hallo, wenn Sie die letzte Bitdarstellung sehen, habe ich gerade die Bits in Bit-Array nach der Konvertierung von Bytearray1 in BitArray gezeigt. Ich muss mein Endergebnis nach dem Ausführen und der Operation zwischen Bytes nach rechts verschieben. –

+1

Hmm aber du sagst 'jetzt muss ich 7 Bits dieses Endergebnisses nach rechts verschieben, was 0000-0000-0000 0000-0000 ** 0110-0000 **' ergeben sollte, da der vorhergehende Schritt '0000-0000 'hatte 0000-0000 ** 0011-0000 ** 0000-0000', ist eine Linksverschiebung. –

Antwort

0

Ich bin mir nicht sicher, warum dies nicht für Sie funktioniert, aber die offensichtliche Ansatz funktioniert, wenn ich es versuchen.

Zum einen übernehmen Sie die beiden Hex-Zahlen in uint Werte haben:

uint data1 = 0x40003019; 
uint data2 = 0x00FFFF80; 

Jetzt nur UND sie zusammen und dann rechts das Ergebnis verschieben:

uint anded = data1 & data2; 
uint result = anded >> 7; // Gives 96 as requested. 

dies ein Ergebnis von 96 gibt.

Wenn Sie Ihre Eingabe eine Zeichenkette der Form ist string str = "0x40003019"; können Sie wandeln es in ein uint etwa so:

uint data1 = uint.Parse(str.Substring(2), NumberStyles.HexNumber); 

Die str.SubString(2) ist nur das "0x" Präfix abstreifen zu. Dies ist nicht erforderlich, wenn die Eingabezeichenfolge kein Präfix "0x" hat.

+0

Hallo, Ja, ich habe es auch auf die gleiche Weise gemacht wie du und hast das Ergebnis. danke für Ihre Hilfe. –

-2

Versuchen folgende:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 


namespace ConsoleApplication33 
{ 

    class Program 
    { 

     static void Main(string[] args) 
     { 
      List<string> digits = new List<string>() { 
            "0000","0001","0010","0011","0100","0101","0110","0111", 
            "1000","1001","1010","1011","1100","1101","1110","1111" 
           }; 
      string input = "0100-0000 0000-0000 0011-0000 0001-1001"; 
      byte[] bytes = input.Split(new char[] { '-', ' ' }).Select(x => (byte)digits.IndexOf(x)).ToArray(); 
      ulong number = BitConverter.ToUInt64(bytes,0); 
      Console.WriteLine(number); 
      Console.ReadLine(); 
     } 
    } 


} 
+1

Würden Sie denken, dass jemand mit 7k Repe seinen Code jetzt korrekt formatieren kann? – Liam

+1

Das macht auch nicht das, was das OP überhaupt will. Sie führen zu keinem Zeitpunkt eine Bit-Verschiebung durch? – Liam

+0

Ja mit BitConverter. – jdweng