【问题标题】:c# netcore2.0 int to bytes conversion with endianess supportc# netcore2.0 int 到字节转换,支持字节序
【发布时间】:2019-06-30 11:46:41
【问题描述】:

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

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

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

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

以下方法对于 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);
    }
}

【问题讨论】:

标签: c# .net-core endianness


【解决方案1】:

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

if(BitConverter.IsLittleEndian)

与:

if (false/*BitConverter.IsLittleEndian*/)

并使用调试器检查字节是否实际反转。如果是这样(确实如此),那么它就可以工作,因为 Little-Endian 和 Big-Endian 之间的区别在于字节顺序。

对你的代码只有一条评论(这可能更多地在Code Review 的范围内):

使用:

Array.Reverse(littleEndianBytes);

在方法中:

Int32 FromLittleEndianBytes(this byte[] littleEndianBytes)

不是最佳实践,因为您正在反转发送到该方法的字节数组。该方法的用户可能没有预料到并感到困惑。

【讨论】:

    猜你喜欢
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 2020-03-01
    • 2013-11-23
    相关资源
    最近更新 更多