我最近遇到了需要频繁(和轻松)转换的问题。从通过TCP接收的BigEndian字节数组中提取字节。对于那些不熟悉Big / Little Endian的人来说,简短的版本是每个号码都以MSB然后LSB的形式发送。
使用Little Endian系统上的默认BitConverter处理和提取字节数组中的值时(读取:几乎所有C#/ windows机器),这是一个问题。
答案 0 :(得分:1)
以下是我在项目中创建的一些方便的扩展方法,我认为我会与其他读者分享。这里的技巧是仅反转所请求数据大小所需的字节。
作为奖励,byte []扩展方法使代码整洁(在我看来)。
评论&欢迎改进。
要使用的语法:
var bytes = new byte[] { 0x01, 0x02, 0x03, 0x04 };
var uint16bigend = bytes.GetUInt16BigE(2); // MSB-LSB ... 03-04 = 772
var uint16bitconv = bytes.GetUInt16(2); // LSB-MSB ... 04-03 = 1027
这是具有初始扩展集的类。易于读者扩展和扩展定制
public static class BitConverterExtensions
{
public static UInt16 GetUInt16BigE(this byte[] bytes, int startIndex)
{
return BitConverter.ToUInt16(bytes.Skip(startIndex).Take(2).Reverse().ToArray(), 0);
}
public static UInt32 GetUInt32BigE(this byte[] bytes, int startIndex)
{
return BitConverter.ToUInt32(bytes.Skip(startIndex).Take(4).Reverse().ToArray(), 0);
}
public static Int16 GetInt16BigE(this byte[] bytes, int startIndex)
{
return BitConverter.ToInt16(bytes.Skip(startIndex).Take(2).Reverse().ToArray(), 0);
}
public static Int32 GetInt32BigE(this byte[] bytes, int startIndex)
{
return BitConverter.ToInt32(bytes.Skip(startIndex).Take(4).Reverse().ToArray(), 0);
}
public static UInt16 GetUInt16(this byte[] bytes, int startIndex)
{
return BitConverter.ToUInt16(bytes, startIndex);
}
public static UInt32 GetUInt32(this byte[] bytes, int startIndex)
{
return BitConverter.ToUInt32(bytes, startIndex);
}
public static Int16 GetInt16(this byte[] bytes, int startIndex)
{
return BitConverter.ToInt16(bytes, startIndex);
}
public static Int32 GetInt32(this byte[] bytes, int startIndex)
{
return BitConverter.ToInt32(bytes, startIndex);
}
}
答案 1 :(得分:1)
您可能希望查看使用端语感知的BinaryReader / BinaryWriter实现。以下是一些链接:
Anculus.Core.IO有一个可识别字的BinaryReader
,BinaryWriter
和BitConverter
:https://code.google.com/p/libanculus-sharp/source/browse/trunk/src/Anculus.Core/IO/?r=227
Iso-Parser项目(用于解析ISO磁盘映像的解析器)具有endian-aware BitConverter
Rabbit MQ(Rabbit Message Queue)在BinaryReader
的Github上有一个大端BinaryWriter
和https://github.com/rabbitmq/rabbitmq-dotnet-client。