Lea*_*yes 6 .net c# unit-testing endianness
由于字节顺序,我正在使用这两种方法BitConverter.GetBytes并Array.Reverse从文件中读取和写入二进制数据.
我的单元测试正在通过,实现似乎很好.
如何模拟BitConverter.IsLittleEndian与单元测试相反的环境?
扩展我的评论:您需要使用 IoC(控制反转)BitConverterEx在您需要的地方注入实例。该类有一个“参数”:byte[]它将读取/写入的输出的字节顺序。
最后这个问题类似于常见问题“我如何模拟DateTime.Now”
在单元测试中,BitConverterEx您可以在ManipulableBitConverterEx可以控制处理器标志的位置注入 ,而不是注入 a 。或者更正确地说,您应该独立地对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;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,如果您需要多次重用此类,Array.Reverse则可能会“慢”。有一些解决方案可以反转使用移位、或、异或等操作单个字节的数据类型的字节顺序。
| 归档时间: |
|
| 查看次数: |
333 次 |
| 最近记录: |