2015-11-07 111 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} 
}