我如何模拟BitConverter.IsLittleEndian与我的单元测试相反的环境?

问题描述 投票:6回答:1

由于字节顺序,我使用两种方法BitConverter.GetBytesArray.Reverse来读取和写入文件中的二进制数据。

我的单元测试正在通过,实现似乎很好。

如何模拟BitConverter.IsLittleEndian与我的单元测试相反的环境?

c# .net unit-testing endianness
1个回答
3
投票

扩展我的评论:你需要使用IoC(控制反转)在你需要的地方注入一个BitConverterEx实例。这个类有一个“参数”:它将读/写的输出byte[]的字节顺序。

最后这个问题类似于常见的问题“如何模仿DateTime.Now

在单元测试中,您可以注入BitConverterEx而不是注入ManipulableBitConverterEx,您可以在其中控制处理器标志。或者更准确地说,你应该单独测试BitConverterEx和你的类,这样当你测试你的类时,你知道BitConverterEx的结果是正确的。

public class BitConverterEx
{
    public bool ProcessorLittleEndian { get; protected set; }
    public bool DataLittleEndian { get; protected set; }

    public BitConverterEx(bool dataLittleEndian)
    {
        ProcessorLittleEndian = BitConverter.IsLittleEndian;
        DataLittleEndian = dataLittleEndian;
    }

    public byte[] GetBytes(int value)
    {
        byte[] bytes = BitConverter.GetBytes(value);

        if (DataLittleEndian != ProcessorLittleEndian)
        {
            Array.Reverse(bytes);
        }

        return bytes;
    }

    public int ToInt32(byte[] value, int startIndex)
    {
        if (DataLittleEndian == ProcessorLittleEndian)
        {
            return BitConverter.ToInt32(value, startIndex);
        }

        byte[] value2 = new byte[sizeof(int)];
        Array.Copy(value, startIndex, value2, 0, value2.Length);
        Array.Reverse(value2);
        return BitConverter.ToInt32(value2, 0);
    }
}

public class ManipulableBitConverterEx : BitConverterEx
{
    public ManipulableBitConverterEx(bool processorLittleEndian, bool dataLittleEndian)
        : base(dataLittleEndian)
    {
        ProcessorLittleEndian = processorLittleEndian;
    }
}

请注意,如果您需要多次重复使用此类,Array.Reverse可能会“慢”。有一些解决方案可以反转使用shift操作单个字节的数据类型的字节顺序,或者,xor,...

© www.soinside.com 2019 - 2024. All rights reserved.