2015-11-07 112 views
1

我想將字符串「8BABEEF9D2472E65」轉換爲big endian。在c中轉換little endian爲big endian#

我已經輸入了這個函數,我收到UINT Size error ..我該怎麼辦?

功能:

string bigToLittle(string data) 
    { 
     int number = Convert.ToInt32(data, 16); 
     byte[] bytes = BitConverter.GetBytes(number); 
     string retval = ""; 
     foreach (byte b in bytes) 
      retval += b.ToString("X2"); 
     return retval; 
    } 
+0

難道這意味着是一個64位的整數?不清楚爲什麼你想要返回一個字符串,而不是將它解析爲'long'或'ulong',如果是的話(把它轉換爲'int'肯定是一個壞方法,因爲你有64位的數據,而不是32 ...) –

+1

爲了成功地將little endian轉換爲big endian(反之亦然),您需要知道每種數據類型的大小(以字節爲單位)。例如,它們是字節(然後你完成了),16位整數(交換兩個字節),32位整數(反向順序),64位等等。換句話說,那個十六進制字符串應該是一個數字,還是它的數組數組?這非常重要。 – MicroVirus

+1

請說明給定字符串的預期輸出, – Heinzi

回答

3

我認爲你可以使用System.Runtime.Remoting.Metadata.W3cXsd2001.SoapHexBinary類。

string input = "8BABEEF9D2472E65"; 
var output = new SoapHexBinary(SoapHexBinary.Parse(input).Value.Reverse().ToArray()) 
      .ToString(); 

輸出:652E47D2F9EEAB8B

或可能

var output = IPAddress.HostToNetworkOrder(long.Parse(input, NumberStyles.HexNumber)) 
      .ToString("X"); 
+0

你可以使用較少的代碼完成同樣的操作:) long.Parse(input,System.Globalization.NumberStyles.HexNumber) –

+0

@Taumantis你真的看過我的回答嗎?我發佈了~55分鐘前,你的評論:) – Eser

+0

是的,我做了,我知道'IPAddress.HostToNetworkOrder(long.Parse(input,NumberStyles.HexNumber)) .ToString(「X」);'也可以寫因爲只有'var output = long.Parse(輸入,System.Globalization.NumberStyles.HexNumber)'。 Sorrry指出它,我只是沒有看到'IPAddress.HostToNetworkOrder'的原因,但也許你可以用一些理論支持它,因爲我們的提問者創建了這樣一個充滿特定信息的問題:PI試圖在行之間讀取,但.. ..也許你還帶別的東西來? :) –

1

我們無法猜測你想要的輸出我讓自己寫丟失的可能性(代碼中的註釋)什麼exacly ...你可以選擇你真實地需要:

internal class Program 
{ 
    private static int ReverseBytes(long val) 
    { 
     byte[] intAsBytes = BitConverter.GetBytes(val); 
     Array.Reverse(intAsBytes); 
     return BitConverter.ToInt32(intAsBytes, 0); 
    } 

    private static string IntToBinaryString(long v) 
    { 
     string s = Convert.ToString(v, 2); 
     string t = s.PadLeft(32, '0'); 
     string res = ""; 
     for (int i = 0; i < t.Length; ++i) 
     { 
      if (i > 0 && i%8 == 0) 
       res += " "; 
      res += t[i]; 
     } 
     return res; 
    } 

    private static void Main(string[] args) 
    { 
     string sValue = "8BABEEF9D2472E65"; 
     long sValueAsInt = long.Parse(sValue, System.Globalization.NumberStyles.HexNumber); 
     //output {-8382343524677898651} 
     string sValueAsStringAgain = IntToBinaryString(sValueAsInt); 
     //output {10001011 10101011 11101110 11111001 11010010 01000111 00101110 01100101} 
     byte[] data = Encoding.BigEndianUnicode.GetBytes(sValue); 
     string decodedX = Encoding.BigEndianUnicode.GetString(data); 
     string retval = data.Aggregate("", (current, b) => current + b.ToString("X2")); 
     //output {0038004200410042004500450046003900440032003400370032004500360035} 

     char[] decodedX2 = Encoding.BigEndianUnicode.GetString(data).Reverse().ToArray(); 
     StringBuilder retval2 = new StringBuilder(); //output {56E2742D9FEEBAB8} 
     foreach (var b in decodedX2) 
      retval2.Append(b); 


     Console.ReadLine(); 
    } 
} 

}

和回合你的方法:

public static string bigToLittle(string data) 
{ 
    long sValueAsInt = long.Parse(data, System.Globalization.NumberStyles.HexNumber); 
    byte[] bytes = BitConverter.GetBytes(sValueAsInt); 
    string retval = ""; 
    foreach (byte b in bytes) 
     retval += b.ToString("X2"); 
    return retval; //output {652E47D2F9EEAB8B} 
}