c# - 如何在不使用任何系统辅助函数的情况下将 byte[] 转换为 c# 中的 int?
问题描述
要将 byte[] 转换为 int,我通常会使用BitConverter.ToInt32
,但我目前正在一个名为 UdonSharp 的框架中工作,该框架限制对大多数System
方法的访问,因此我无法使用该辅助函数。我可以很容易地手动进行反向操作(将 int 转换为 byte[]),如下所示:
private byte[] GetBytes(int target)
{
byte[] bytes = new byte[4];
bytes[0] = (byte)(target >> 24);
bytes[1] = (byte)(target >> 16);
bytes[2] = (byte)(target >> 8);
bytes[3] = (byte)target;
return bytes;
}
但我正在努力让它反过来工作。非常感谢任何帮助!
解决方案
您可以在此处查看代码:https ://referencesource.microsoft.com/#mscorlib/system/bitconverter.cs
#if BIGENDIAN
public static readonly bool IsLittleEndian /* = false */;
#else
public static readonly bool IsLittleEndian = true;
#endif
[System.Security.SecuritySafeCritical] // auto-generated
public static unsafe int ToInt32(byte[] value, int startIndex) {
if (value == null) {
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.value);
}
if ((uint) startIndex >= value.Length) {
ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.startIndex, ExceptionResource.ArgumentOutOfRange_Index);
}
if (startIndex > value.Length - 4) {
ThrowHelper.ThrowArgumentException(ExceptionResource.Arg_ArrayPlusOffTooSmall);
}
Contract.EndContractBlock();
fixed(byte * pbyte = & value[startIndex]) {
if (startIndex % 4 == 0) { // data is aligned
return *((int * ) pbyte);
} else {
if (IsLittleEndian) {
return ( * pbyte) | ( * (pbyte + 1) << 8) | ( * (pbyte + 2) << 16) | ( * (pbyte + 3) << 24);
} else {
return ( * pbyte << 24) | ( * (pbyte + 1) << 16) | ( * (pbyte + 2) << 8) | ( * (pbyte + 3));
}
}
}
}
推荐阅读
- ios - 由于在 WiFi 上运行 iOS 12.2 的 iPhone 和 iPad 崩溃,Apple 拒绝了我的应用
- python - 如何找到 RDD 的 MIN 和 MAX
- sql - 在 Rails 中递归获取记录
- c++ - 进程 rc 无法启动
- javascript - 启动 npm 时使用 log4js appender 调试错误
- sql - 如何从 azure sql 中删除损坏的数据库
- openstack - 无法建立与 http://controller:8774/v2.1/flavors/detail 的连接
- google-sheets - 试图解决跨两张表搜索 X 值的列 - 如果是这样,则返回相应的 Y 值
- java - 使用 printwriter 从列表中创建包含多行的文本文件
- php - 如何在 Wordpress 中按类别显示最受欢迎的标签