【发布时间】:2021-04-30 06:40:37
【问题描述】:
要将 int 转换为 byte[],我通常会使用 BitConverter,但我目前正在一个名为 UdonSharp 的框架中工作,该框架限制对大多数 System 方法的访问,所以我无法使用它辅助功能。到目前为止,这是我想出的:
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;
}
它在大多数情况下都有效,但问题是当target 大于255 时它会中断,抛出异常Value was either too large or too small for an unsigned byte.。我想这是因为在最后一部分bytes[3] = (byte)target; 它试图将大于 255 的值直接转换为 int。但我只是希望它将 int 的最后 8 位转换为最终字节,而不是全部。我怎样才能做到这一点?提前致谢!
【问题讨论】:
-
您需要屏蔽掉不需要的位:
bytes[3] = (byte)(target & 0xFF)等 -
如果问题是屏蔽问题,那么他必须屏蔽所有四个字节......然后我建议你尝试使用
int.MaxValue和int.MinValue来确定。 -
是的,在类型转换之前,所有结果都应该是 % 256。 (或其他评论中提到的位掩码)
-
旁注:实际上有一个很好的理由避免在这里使用
BitConverter,即使它可用——或者至少谨慎对待它;BitConverter是 CPU-endian,这意味着它不会总是在所有设备上产生相同的输出;然而,shift+mask 方法是与字节序无关的,并且在任何地方都可以正常工作。在现代 .NET 中,有一个BinaryPrimitives类型在很大程度上取代了BitConverter;它处理跨度,并具有特定于字节序的方法。
标签: c# type-conversion bit-shift