7
A
回答
2
我很惊讶没有人有建议BitConverter
呢。假设你已经在独立变量的三个字节:
var data = new byte[]
{
byte0 & 0x80 == 0 ? 0 : 0xFF, byte0, byte1, byte2
};
return BitConverter.ToInt32(data, 0);
或者:
var data = new byte[] { byte0, byte1, byte2, 0x00 };
return BitConverter.ToInt32(data, 0) >> 8;
0
int converted = ((bytes[2] << 24) | (bytes[1] << 16) | (bytes[0] << 8)) >> 8;
0
我被Bitconverter的小尾数性质烧一次。 下面是一个替代方法: PS:格式不是小端,它的其他方式与MSB第一!还我试图格式化输出比特码的手动,但未能
输出:
=======测试24位的Int32(MSB首先/左)======= 预期: 8388607 Bit24ToInt32测试:8388607 预计:-1 Bit24ToInt32测试:-1 预计:-8388607 Bit24ToInt32测试:-8388607 预计:6147053 Bit24ToInt32测试:6147053
预计:-6147053 Bit24ToInt32测试:-6147053
=======测试16位到Int32(MSB First/Left)= ====== 预计:32767 Bit16ToInt32测试:32767 预计:-1 Bit16ToInt32测试:-1 预计:-32767 Bit16ToInt32测试:-32767 预期:24045 Bit16ToInt32测试:24045
预计:-24045 Bit16ToInt32测试:-24045
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BitExperiments
{
class Program
{
static void Main(string[] args)
{
//Test 16bit to Int32(MSB First/Left)
Console.WriteLine("=======Test 24 bit to Int32 (MSB First/Left)=======");
Dictionary<int,byte[]> cases = new Dictionary<int,byte[]>();
byte[] bytearr;
int expectedResult;
bytearr = new byte[] { 0x7F, 0xFF, 0xFF };
expectedResult= 8388607;//Max
cases.Add(expectedResult,bytearr);
bytearr = new byte[] { 0xFF, 0xFF, 0xFF };
expectedResult = (-1);//Mid
cases.Add(expectedResult,bytearr);
bytearr = new byte[] { 0x80, 0x00, 0x01 };
expectedResult = (-8388607);//Min
cases.Add(expectedResult,bytearr);
bytearr = new byte[] { 0x5D, 0xCB, 0xED };
expectedResult= 6147053;//Random
cases.Add(expectedResult,bytearr);
bytearr = new byte[] { 0xA2, 0x34, 0x13 };
expectedResult= (-6147053);//Random inverted
cases.Add(expectedResult,bytearr);
foreach (var value in cases)
{
Console.WriteLine("Expected: {0} \t\t Bit24ToInt32 Test: {1}", value.Key, Bit24ToInt32(value.Value));
}
Console.WriteLine("===================================================");
Console.WriteLine();
//Test 16bit to Int32(MSB First/Left)
Console.WriteLine("=======Test 16 bit to Int32 (MSB First/Left)=======");
cases.Clear();
bytearr = new byte[] { 0x7F, 0xFF };
expectedResult = 32767;//Max
cases.Add(expectedResult, bytearr);
bytearr = new byte[] { 0xFF, 0xFF };
expectedResult = (-1);//Mid
cases.Add(expectedResult, bytearr);
bytearr = new byte[] { 0x80, 0x01 };
expectedResult = (-32767);//Min
cases.Add(expectedResult, bytearr);
bytearr = new byte[] { 0x5D, 0xED };
expectedResult = 24045;//Random
cases.Add(expectedResult, bytearr);
bytearr = new byte[] { 0xA2, 0x13 };
expectedResult = (-24045);//Random inverted
cases.Add(expectedResult, bytearr);
foreach (var value in cases)
{
Console.WriteLine("Expected: {0} \t\t Bit16ToInt32 Test: {1}", value.Key, Bit16ToInt32(value.Value));
}
Console.WriteLine("===================================================");
Console.ReadLine();
}
private static int Bit24ToInt32(byte[] byteArray)
{
int result = (
((0xFF & byteArray[0]) << 16) |
((0xFF & byteArray[1]) << 8) |
(0xFF & byteArray[2])
);
if ((result & 0x00800000) > 0)
{
result = (int)((uint)result|(uint)0xFF000000);
}
else
{
result = (int)((uint)result & (uint)0x00FFFFFF);
}
return result;
}
private static int Bit16ToInt32(byte[] byteArray) {
int result = (
((0xFF & byteArray[0]) << 8) |
(0xFF & byteArray[1])
);
if ((result & 0x00008000) > 0) {
result = (int) ((uint) result | (uint) 0xFFFF0000);
} else {
result = (int) ((uint) result & (uint) 0x0000FFFF);
}
return result;
}
}
}
相关问题
- 1. 转换为32位整数24位整数(2S补码)在C++
- 2. 将十六进制转换为二进制和16位二进制补码
- 3. 二进制补码转换
- 4. 如何将补码从二进制补码转换为
- 5. 使用java将32位二进制补码转换为十进制数
- 6. 将十进制转换为二进制补码,溢出
- 7. 使用16位将十进制数转换为2的补码
- 8. 将无符号整数转换为C中的48位二进制数
- 9. 长整数的二进制补码
- 10. 16位二进制补码
- 11. 在C中将整数转换为二进制文件#
- 12. C#短错误:否定二进制补码数的最小值无效
- 13. 如何将一个负整数转换为二进制补码二进制形式? (Java)
- 14. 转换十进制整数为4位二进制
- 15. 将64位二进制转换为长整数
- 16. 将整数转换为32位二进制 - 输出反向
- 17. 使用整数将8位二进制转换为BCD
- 18. 上午/下午将24位整数转换为12小时
- 19. C#:将24位整数转换为三字节数组?
- 20. 如何将二进制数字转换为erlang中的整数?
- 21. C++将二进制(64位)转换为十进制
- 22. 长整数的小数转换为二进制
- 23. 64位二进制补码形式的负整数
- 24. 将二进制位转换为十六进制值
- 25. Ç - 转换为二进制补
- 26. C++将二进制转换为大于64位的位的十进制
- 27. 如何将二进制数(32位)转换为十进制数?
- 28. 将十进制数字转换为6位二进制数字
- 29. C++将八进制小数转换为十进制小数?
- 30. 使用C将整数转换为二进制表示?
如果你想让它跨不同字节序架构正常工作,那么你需要手动测试'BitConverter.IsLittleEndian'并相应地调整你的'data'排列的顺序。这比首先手动完成手动操作要复杂得多。 – LukeH 2010-07-24 00:34:27
好,卢克。 XBox(也可能是Mono)支持大端架构。 – 2010-07-24 00:42:53
非常感谢您的解释! – Evan 2010-07-24 00:48:36