C#netcore2.0 int到字节转换与字节序支持

时间:2019-06-30 11:46:41

标签: c# .net-core endianness

我正在开发一个信封加密库,其中信封结构是字节数组的组合。

keyAlias length , keyAlias , IVBytes, cipherBytes = 
[int][keyAlias][IV][cipherBytes]

当我存储int的前4个字节以从信封字节中检索keyAlias的长度时,寻找对int到字节再返回int的正确处理。

假设:我决定始终将Little-Endian格式的int字节存储在信封字节中。

对int进行以下方法将字节正确。我无法测试它是否无法访问Big-Endian机器。

[Fact]
public void IntToByteConverion_ShouldConvertBack2()
{
    var intBytes = 2.ToLittleEndianBytes();

    //Store intBytes to Database or AWS S3
    // Retrive back the bytearray and convert to int32.

    int intValue = intBytes.FromLittleEndianBytes();

    Assert.Equal(2, intValue);
}

public static byte[] ToLittleEndianBytes(this int value)
{
    if (BitConverter.IsLittleEndian)
    return BitConverter.GetBytes(value);
    else
    {
        var bigEndianBytes = BitConverter.GetBytes(value);
        Array.Reverse(bigEndianBytes);// Converted to LittleEndian
        return bigEndianBytes;
    }
}

public static Int32 FromLittleEndianBytes(this byte[] littleEndianBytes)
{
    if (BitConverter.IsLittleEndian)
    return BitConverter.ToInt32(littleEndianBytes, 0);
    else
    {
        Array.Reverse(littleEndianBytes);// Converted to big endian as machine CPU is big endian
        return BitConverter.ToInt32(littleEndianBytes, 0);
    }
}

1 个答案:

答案 0 :(得分:1)

您所做的工作。要对其进行测试,您可以替换:

if(BitConverter.IsLittleEndian)

具有:

if (false/*BitConverter.IsLittleEndian*/)

并与调试器检查字节是否实际反转。如果是这样(它是),那么它将起作用,因为Little-Endian和Big-Endian之间的区别是字节顺序。

仅对您的代码发表评论(这可能更多地属于Code Review范围):

使用:

Array.Reverse(littleEndianBytes);

在方法中:

Int32 FromLittleEndianBytes(this byte[] littleEndianBytes)

不是最佳实践,因为您正在反转发送给该方法的字节数组。使用该方法的用户可能不会期望它并感到困惑。