C# 在c语言中把小端数转换成大端数#

C# 在c语言中把小端数转换成大端数#,c#,C#,我想将字符串“8BABEEF9D2472E65”转换为big-endian 我已在此函数中输入,收到UINT大小错误。。我该怎么办 功能: string bigToLittle(string data) { int number = Convert.ToInt32(data, 16); byte[] bytes = BitConverter.GetBytes(number); string retval = "";

我想将字符串“8BABEEF9D2472E65”转换为big-endian

我已在此函数中输入,收到UINT大小错误。。我该怎么办

功能:

    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");

我认为您可以使用
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();
    }
}

由于我们无法猜测您想要什么作为输出,所以我让自己编写缺少的可能性(在代码注释中)。。。您可以选择您真正需要的:

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

我喜欢@Sebatsian的答案,但我遇到了条目被额外的零填充的问题,所以我稍微修改了它,以防您正在将Azure中的Linux VMUUID转换为标准格式。我使用了
IPAddress.HostToNetworkOrder
,它处理将长字节分解成字节并反转它们

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
string uuid=“090556DA-D4FA-764F-A9F1-63614EDA0163”;
私有字符串BigToLittle(字符串数据)
{
long sValueAsInt=long.Parse(数据、系统、全球化、NumberStyles、HexNumber);
变量长度=数据长度;
返回IPAddress.HostToNetworkOrder(sValueAsInt).ToString(“X2”).子字符串(0,长度);
}
var elements=uuid.Split(新字符[]{'-});
var outMe=新列表{};
foreach(元素中的变量项)
{
outMe.Add(BigToLittle(项目));
}
var output=String.Join(“-”,outMe);
//DA560509-FAD4-4F76-F1A9-6301DA4E6163

我喜欢@Sebatsian的答案,但我遇到了条目被额外的零填充的问题,所以我稍微修改了它,以防您在Azure中将Linux VMUUID转换为标准格式。我使用了
IPAddress.HostToNetworkOrder
,它处理将长字节分解成字节并反转它们

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
string uuid=“090556DA-D4FA-764F-A9F1-63614EDA0163”;
私有字符串BigToLittle(字符串数据)
{
long sValueAsInt=long.Parse(数据、系统、全球化、NumberStyles、HexNumber);
变量长度=数据长度;
返回IPAddress.HostToNetworkOrder(sValueAsInt).ToString(“X2”).子字符串(0,长度);
}
var elements=uuid.Split(新字符[]{'-});
var outMe=新列表{};
foreach(元素中的变量项)
{
outMe.Add(BigToLittle(项目));
}
var output=String.Join(“-”,outMe);
//DA560509-FAD4-4F76-F1A9-6301DA4E6163

这是否意味着是64位整数?不清楚为什么要返回字符串而不是将其解析为
long
ulong
,如果是这样。。。(将其转换为
int
肯定是一种不好的方法,因为您有64位数据,而不是32位…)为了成功地将小端数转换为大端数(反之亦然),您需要知道每种数据类型的大小(字节)。例如,它们是字节(完成后)、16位整数(交换两个字节)、32位整数(逆序)、64位等等。换句话说,十六进制字符串应该是一个数字,还是一个数字数组?这非常重要。请说明给定字符串的预期输出,这是否意味着是64位整数?不清楚为什么要返回字符串而不是将其解析为
long
ulong
,如果是这样。。。(将其转换为
int
肯定是一种不好的方法,因为您有64位数据,而不是32位…)为了成功地将小端数转换为大端数(反之亦然),您需要知道每种数据类型的大小(字节)。例如,它们是字节(完成后)、16位整数(交换两个字节)、32位整数(逆序)、64位等等。换句话说,十六进制字符串应该是一个数字,还是一个数字数组?这是非常重要的。请说明您对给定字符串的预期输出,您可以用更少的代码完成相同的输出:)long.Parse(输入,System.Globalization.NumberStyles.HexNumber)@Taumantis您真的读过我的答案了吗?我在你发表评论前55分钟发布了:)是的,我发布了,
IPAddress.HostToNetworkOrder(long.Parse(input,NumberStyles.HexNumber)).ToString(“X”)
也可以写成仅
var output=long.Parse(输入、系统、全球化、numberstyle.HexNumber)
。抱歉,我想指出,我只是不明白为什么要
IPAddress.HostToNetworkOrder
,但也许你可以用一些理论来支持它,因为我们的提问者创造了一个充满具体信息的问题:P我试图在字里行间阅读,但。。。也许你还带了别的东西来?:)@同义反复的问题是:
将c中的小端数转换为大端数
HostToNetworkOrder
对由
long.Parse
解析的long执行此操作。需要更多的解释吗?再读一遍。我并不是为了做这件简单的事情而写了一堆文字…你可以用更少的代码来完成同样的事情:)long.Parse(输入,系统,全球化,NumberStyles.HexNumber)@Taumantis你真的读过我的答案了吗?我在你发表评论前55分钟发布了:)是的,我发布了,
IPAddress.HostToNetworkOrder(long.Parse(input,NumberStyles.HexNumber)).ToString(“X”)
也可以写成仅
var output=long.Parse(输入、系统、全球化、numberstyle.HexNumber)
。抱歉,我想指出,我只是不明白为什么要
IPAddress.HostToNetworkOrder
,但也许你可以用一些理论来支持它,因为我们的提问者创造了一个充满具体信息的问题:P我试图在字里行间阅读,但。。。也许你还带了别的东西来?:)@同义词问题是:
Convert lit