简体   繁体   English

如何在不使用任何系统辅助函数的情况下将 c# 中的 byte[] 转换为 int?

[英]How can I convert a byte[] to an int in c# without using any System helper functions?

To convert a byte[] to an int, I would normally use BitConverter.ToInt32 , but I'm currently working within a framework called UdonSharp that restricts access to most System methods, so I'm unable to use that helper function.要将 byte[] 转换为 int,我通常会使用BitConverter.ToInt32 ,但我目前正在一个名为 UdonSharp 的框架内工作,该框架限制对大多数System方法的访问,因此我无法使用该帮助程序 function。 I was able to do the reverse operation manually (converting int to byte[]) quite easily like so:我可以很容易地手动进行反向操作(将 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;
}

But I'm struggling to get it working the other way around.但我正在努力让它反过来工作。 Would greatly appreciate any help!非常感谢任何帮助!

You can check the code here: https://referencesource.microsoft.com/#mscorlib/system/bitconverter.cs您可以在此处查看代码: 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));
      }
    }
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM