c # netcore2.0 int в байты с поддержкой endianess - PullRequest
0 голосов
/ 30 июня 2019

Я занимаюсь разработкой библиотеки шифрования конвертов, в которой структура конверта представляет собой комбинацию байтовых массивов.

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

Поскольку я сохраняю первые 4 байта int для получения длины 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);
    }
}

1 Ответ

1 голос
/ 01 июля 2019

То, что вы сделали, работает.Чтобы проверить это, вы можете заменить:

if(BitConverter.IsLittleEndian)

на:

if (false/*BitConverter.IsLittleEndian*/)

и проверить с помощью отладчика, действительно ли перепутаны байты.Если так (то есть), то это работает, потому что разница между Little-Endian и Big-Endian заключается в порядке следования байтов.

Только один комментарий к вашему коду (это, вероятно, больше в области действия Code Review ):

Использование:

Array.Reverse(littleEndianBytes);

в методе:

Int32 FromLittleEndianBytes(this byte[] littleEndianBytes)

не лучшая практика, так как вы переворачиваете отправленный байтовый массивк методу.Пользователь метода может не ожидать этого и быть сбитым с толку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...