求助C#中 BitConverter.ToUInt16 的实现方法

CaptainSCH 算法工程师  2016-06-27 10:14:52
1、在从数组转换到 int16时 是有一个交换高低字节 的过程吗?
2、如果有源码的话~欢迎共享
3、现在24bit的int数组,可以怎样转换成int型? 我自己思考觉得可以通过填充高位,然后利用BitConverter.ToUInt32,可是具体怎样填,填什么还没想清楚。
...全文
387 8 点赞 打赏 收藏 举报
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
tcmakebest 2016-06-28
1、在从数组转换到 int16时 是有一个交换高低字节 的过程吗? 如果存储位置颠倒时需要交换 3、现在24bit的int数组,可以怎样转换成int型? 我自己思考觉得可以通过填充高位,然后利用BitConverter.ToUInt32,可是具体怎样填,填什么还没想清楚。 24bit的int数组,这是绕口令吗? 要考虑是否有符号位,如果无符号在高位补8个0, 如果有符号则最高位是几(0或1)就补8个几,再按照32位转换.
  • 打赏
  • 举报
回复
zhishiheng 2016-06-28
[SecuritySafeCritical, __DynamicallyInvokable]
public static unsafe short ToInt16(byte[] value, int startIndex)
{
if (value == null)
{
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.value);
}
if (((ulong) startIndex) >= value.Length)
{
ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.startIndex, ExceptionResource.ArgumentOutOfRange_Index);
}
if (startIndex > (value.Length - 2))
{
ThrowHelper.ThrowArgumentException(ExceptionResource.Arg_ArrayPlusOffTooSmall);
}
fixed (byte* numRef = &(value[startIndex]))
{
if ((startIndex % 2) == 0)
{
return *(((short*) numRef));
}
if (IsLittleEndian)
{
return (short) (numRef[0] | (numRef[1] << 8));
}
return (short) ((numRef[0] << 8) | numRef[1]);
}
}


  • 打赏
  • 举报
回复
zhishiheng 2016-06-28
[CLSCompliant(false), __DynamicallyInvokable]
public static ushort ToUInt16(byte[] value, int startIndex)
{
if (value == null)
{
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.value);
}
if (((ulong) startIndex) >= value.Length)
{
ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.startIndex, ExceptionResource.ArgumentOutOfRange_Index);
}
if (startIndex > (value.Length - 2))
{
ThrowHelper.ThrowArgumentException(ExceptionResource.Arg_ArrayPlusOffTooSmall);
}
return (ushort) ToInt16(value, startIndex);
}


  • 打赏
  • 举报
回复
slj311 2016-06-28
没有用过,不常用吧,什么地方用的
  • 打赏
  • 举报
回复
xuzuning 2016-06-28
24bit 是 3个字节,你去探究 BitConverter.ToUInt16 的算法实现是不对的,至少应该是 BitConverter.ToUInt32 才对 这个 3 byte 的数组,如果用补位法通过 BitConverter.ToUInt32 转换,需要根据用途考虑是补在前面还是补在后面 如果这个数组只是表示 RGB 三原色,那么宜用移位操作进行转换 如果这个数组表示的是 可变长度整数(xls、chm、mid 等中被广泛使用),那就需要去找库函数或自行编码解决了 总之,你得先弄清你这个数据的含义,然后才能找到合适的方法
  • 打赏
  • 举报
回复
threenewbee 2016-06-27
这个取决于你的计算机是大端序还是小端序。默认重载下直接复制内存,不需要交换。
  • 打赏
  • 举报
回复
wanghui0380 2016-06-27
这点其实在msdn对字节序的影响部分已经解释很清楚了 https://msdn.microsoft.com/zh-cn/library/system.bitconverter.aspx
  • 打赏
  • 举报
回复
wanghui0380 2016-06-27
1.这个取决于平台环境,通常net会自己判定 2.net源代码早就开源 3.无需你在去填充,net会自己填充和丢弃(超出部分丢弃,不足部分知道按平台字节序补足)
  • 打赏
  • 举报
回复
相关推荐
发帖
C#
加入

10.6w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2016-06-27 10:14
社区公告

让您成为最强悍的C#开发者