我需要将一个Int32值转换为3字节(24位)整数。字节序保持不变(小端),但我无法找出如何适当地移动符号。这些值已经被限制在正确的范围内,我只是无法想出如何将4个字节转换为3个字节。使用C# 4.0。这是为了硬件集成,所以我必须有24位的值,不能使用32位。
我需要将一个Int32值转换为3字节(24位)整数。字节序保持不变(小端),但我无法找出如何适当地移动符号。这些值已经被限制在正确的范围内,我只是无法想出如何将4个字节转换为3个字节。使用C# 4.0。这是为了硬件集成,所以我必须有24位的值,不能使用32位。
int myInt = 800;
byte[] myByteArray = System.BitConverter.GetBytes(myInt);
编辑:
正如Jeremiah指出的那样,你需要做一些像这样的事情
int myInt = 800;
byte[] myByteArray = System.BitConverter.GetBytes(myInt);
if (BitConverter.IsLittleEndian) {
// get the first 3 elements
} else {
// get the last 3 elements
}
v & 0xFFFFFF
,无需知道它以何种方式表示为字节。 - Jeremiah WillcockInt32
变量中,可以使用v & 0xFFFFFF
仅获取低24位。我看到了您关于字节数组的评论:如果数组中有空间,请写入数字的所有四个字节,并仅发送前三个字节;但这仅适用于小端系统。Console.Write(-42 & 0xffffff);
。或者我在这里漏掉了什么吗? - drharris42
和-42
在进行AND操作后仍会产生不同的结果。 - Jeremiah Willcockint bit24 = bit32 & 0xffffff;
,然后如果它测试为负数,就执行 bit24 |= 0x800000;
?基本上是手动重置符号位吗? - drharrisif (bit24 & 0x800000) bit32 = (bit24 | 0xFF000000); else bit32 = bit24;
来恢复符号位(因为在转换为32位时,所有高位都需要设置为保持值)。对于一个24位的数,符号位与32位数的位置不同。 - Jeremiah Willcock
i&0xffffff
始终为正)。此外,您可能希望遵循Joe答案的第二部分,该部分适用于具有不同字节序的系统。您现在拥有的代码可以工作,但如果您尝试在PowerPC或MIPS上运行它,则会以异常方式中断。 - Jeremiah Willcockbool
标志。我忽略了第二行会使它变成正数,因此第三行永远不会激活的事实。重点是测试原始数字是否为负数。我将相应地更新答案。我已经考虑了字节序,但我会在解决方案中做出注释,建议你也这样做。 - drharris