在 C# 中将大端转换为小端

Red*_*d-X 0 c# endianness

首先让我说,我已经查看了 Stackoverflow 上的一些帖子。我的问题是我是一名初级程序员,很难将解决方案配置到我的项目中。

我目前正在努力将一个“大端”转换为“小端”。

目前有一个浮动:

(4.61854E-41)

但我想以某种方式将其转换为如下所示:

(-1.0)

任何帮助,将不胜感激。

sLw*_*sLw 6

看看BitConverter

首先你检查你的系统是否是小端,然后根据它反转字节。

float num = 1.2f;

if (!BitConverter.IsLittleEndian)
{
    byte[] bytes = BitConverter.GetBytes(num);
    Array.Reverse(bytes, 0, bytes.Length);

    num = BitConverter.ToSingle(bytes, 0);
}

Console.WriteLine(num);
Run Code Online (Sandbox Code Playgroud)


Rob*_*ner 6

2022 年正确的做法是使用BinaryPrimitives.

    float num = 1.2f;

    if (!BitConverter.IsLittleEndian)
    {
        int bits = BitConverter.SingleToInt32Bits(num);
        int revBits = BinaryPrimitives.ReverseEndianness(bits);
        num = BitConverter.Int32BitsToSingle(revBits);
    }

    Console.WriteLine(num);
Run Code Online (Sandbox Code Playgroud)

这在性能方面得到了更好的优化,并且使用了bswap现代 x86 处理器上的指令。ARM 的等效项是REV32.

请参阅JIT-CodeGen@sLw 的答案之间的差异。

BinaryPrimitives 可从 .NET Core 2.1 和 .NET Standard 2.1 获得。作为 .NET Framework 用户,传统方式仍然是最好的方式(参考:.NET API Catalog)。