[英]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.