簡體   English   中英

在c#中將小端轉換為大端

[英]Convert little endian to big endian in c#

我想將字符串“8BABEEF9D2472E65”轉換為大端。

我已經在這個函數中輸入,我收到 UINT Size 錯誤.. 我該怎么辦?

功能 :

    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; 
    }

我認為您可以使用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");

由於我們無法猜測您想要什么作為輸出,我讓自己寫下缺失的可能性(在代碼注釋中)……您可以選擇您真正需要的:

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}
}

我喜歡@Sebatsian 的回答,但是我遇到了條目被額外零填充的問題,所以我稍微修改了它,以防你正在做一些事情,比如將 Azure 中的 Linux VMUUID 轉換為標准格式。 我使用了IPAddress.HostToNetworkOrder ,它處理將您的 long 分解為字節並反轉它們。

private string BigToLittle(string data)
{
    long sValueAsInt = long.Parse(data, System.Globalization.NumberStyles.HexNumber);
    var length = data.Length;
    return IPAddress.HostToNetworkOrder(sValueAsInt).ToString("X2").Substring(0, length);
}

使用中:

    string uuid = "090556DA-D4FA-764F-A9F1-63614EDA0163";
    
    private string BigToLittle(string data)
    {
        long sValueAsInt = long.Parse(data, System.Globalization.NumberStyles.HexNumber);
        var length = data.Length;
        return IPAddress.HostToNetworkOrder(sValueAsInt).ToString("X2").Substring(0, length);
    }
    var elements = uuid.Split(new char[] { '-' });
    var outMe = new List<string> { };
    foreach (var item in elements)
    {
        outMe.Add(BigToLittle(item));
    }
    var output = String.Join("-", outMe);
    //DA560509-FAD4-4F76-F1A9-6301DA4E6163

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM