我正在开发一个信封加密库,其中信封结构是字节数组的组合。
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);
}
}
答案 0 :(得分:1)
您所做的工作。要对其进行测试,您可以替换:
if(BitConverter.IsLittleEndian)
具有:
if (false/*BitConverter.IsLittleEndian*/)
并与调试器检查字节是否实际反转。如果是这样(它是),那么它将起作用,因为Little-Endian和Big-Endian之间的区别是字节顺序。
仅对您的代码发表评论(这可能更多地属于Code Review范围):
使用:
Array.Reverse(littleEndianBytes);
在方法中:
Int32 FromLittleEndianBytes(this byte[] littleEndianBytes)
不是最佳实践,因为您正在反转发送给该方法的字节数组。使用该方法的用户可能不会期望它并感到困惑。