Tag: 二进制

64位定点乘法错误

我在C#中实现了一个64位定点签名的31.32数字类型,基于long 。 到目前为止,添加和减法都很好。 然而,乘法有一个我想要解决的烦人的情况。 我当前的算法包括将每个操作数分成最高和最低有效32位,执行4次乘法到4个长度并添加这些长度的相关位。 这是代码: public static Fix64 operator *(Fix64 x, Fix64 y) { var xl = x.m_rawValue; // underlying long of x var yl = y.m_rawValue; // underlying long of y var xlow = xl & 0x00000000FFFFFFFF; // take the 32 lowest bits of x var xhigh = xl >> 32; // take […]

在C#中使用任意位位置和长度提取字节边界的值

我目前正在研究一种网络工具,它需要对特定协议进行解码/编码,该协议将字段打包到任意位置的密集位数组中。 例如,协议的一部分使用3个字节来表示许多不同的字段: Bit Position(s) Length (In Bits) Type 0 1 bool 1-5 5 int 6-13 8 int 14-22 9 uint 23 1 bool 如您所见,有几个字段跨越多个字节。 许多(大多数)也比可能用于表示它们的内置类型短,例如第一个只有5位长的int字段。 在这些情况下,目标类型的最高有效位(例如Int32或Int16)应填充为0以弥补差异。 我的问题是我很难处理这类数据。 具体来说,我很难弄清楚如何有效地获取任意长度的位数组,用源缓冲区中的相应位填充它们,填充它们以匹配目标类型,并将填充的位数组转换为目标类型。 在理想的世界中,我将能够获取上面示例中的byte [3]并调用GetInt32(byte[] bytes, int startBit, int length) 。 我发现的最接近的东西是BitStream类,但它似乎希望单个值在字节/字边界上排列(并且类的半流/半索引访问约定使它变得有点混乱)。 我自己的第一次尝试是使用BitArray类,但事实certificate这有点笨拙。 很容易将缓冲区中的所有位填充到一个大的BitArray ,只将你想要的那些从源BitArray转移到一个新的临时BitArray ,然后将其转换为目标值…但它似乎是错误的,而且非常耗时的。 我现在正在考虑一个类如下的类,它引用(或创建)源/目标byte []缓冲区以及偏移量,并为某些目标类型提供get和set方法。 棘手的部分是获取/设置值可能跨越多个字节。 class BitField { private readonly byte[] _bytes; private readonly int _offset; […]

C#,从二进制文件中读取结构

我想从二进制文件中读取结构。 在C ++中,我会这样做: stream.read((char*)&someStruct, sizeof(someStruct)); 在C#中是否有类似的方式? BinaryReader仅适用于内置类型。 在.NET 4中有一个MemoryMappedViewAccessor。 它提供了类似Read ,这似乎是我想要的,除了我手动必须跟踪我想要读取的文件中的位置。 有没有更好的办法?

C#二进制常量表示

我真的很难过这个。 在C#中有一个hex常量表示格式如下: int a = 0xAF2323F5; 是否有二进制常量表示格式?

C#反序列化已移动或已重命名的类

如果我在名为“AssemblyA”的程序集中有一个名为“MyClass”的类,并使用.NET的BinaryFormatter将其序列化为一个文件。 然后将“MyClass”的代码移动到名为“AssemblyB”的程序集中,并尝试反序列化该文件,我得到以下“System.TypeLoadException”exception: 无法从程序集’AssemblyA,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null’加载类型’AssemblyA.MyClass’。 有没有办法让我表明该课程已被移至AssemblyB? 通过某种属性? 或者是否可以将序列化文件修改为预处理步骤,以将AssemblyA.MyClass中的所有引用更改为AssemblyB.MyClass? 最后,如果这些选项都不可能,是否可以绕过尝试反序列化该类并继续反序列化其余数据?

二进制字符串到整数

我有一个由用户输入的二进制字符串,我需要将其转换为整数。 起初我天真地使用了这条简单的线: Convert.ToInt32(“11011”,2); 不幸的是,如果用户直接输入整数,则抛出exception。 Convert.ToInt32(“123”,2); // throws Exception 如何确保用户输入的字符串实际上是二进制字符串? try..catch ….但那太难看了。 类似’Int32.TryParse’的东西也许。 谢谢

以C-BinaryReader.ReadString的7位格式编码整数

C#的BinaryReader有一个函数,根据MSDN,读取一个编码为“七位整数”的整数,然后读取一个长度为整数的字符串。 是否有一个清晰的七位整数格式文档(我粗略地了解MSB或LSB标记是否有更多字节要读取,其余位是数据,但我会很高兴更精确的东西)。 更好的是,是否有以这种格式读写数字的C实现?

在C#中将二进制转换为十进制的程序?

我想创建一个基本程序,使我能够将二进制数转换为十进制数,但几乎无处不在互联网上,我只是无法找到一个有效的解决方案! 我似乎无法遵循解决方案,到目前为止我已经开发了一些代码,但不确定它是否正确,有什么帮助吗? 谢谢 int iBinaryNum; //To store binary number string sDecimalNum; //To store decimal numbers Console.WriteLine(“Enter the binary number you want to convert to decimal”); iBinaryNum = Convert.ToInt32(Console.ReadLine()); Console.WriteLine(“The Binary number you have entered is ” + iBinaryNum); sDecimalNum = Convert.ToString(iBinaryNum, 2); Console.WriteLine(“This converted into decimal is ” + sDecimalNum); //Prevent program from closing Console.WriteLine(“Press […]

如何二进制序列化程序自定义类

我有这个自定义类: public class MyClass { private byte byteValue; private int intValue; private MyClass myClass1= null; private MyClass myClass2 = null; } 显然我也有构造函数和get / set方法。 在我的主窗体中,我初始化了很多MyClass对象(请注意,在MyClass对象中,我引用了其他2个MyClass对象)。 初始化后,我遍历第一个MyClass项,调用它为例如“root”。 所以,例如我做的事情如下: MyClass myClassTest = root.getMyClass1(); MyClass myClassTest2 = myClassTest.getMyClass1(); 等等。 不,我想存储在二进制文件中,实例化所有MyClass对象,以便在软件重启后再次获取它们。 我完全不知道如何做到这一点,有人可以帮助我吗? 谢谢。

C#二进制数据转换为字符串

这是交易。 我发现了一个源代码并稍微改了一下,所以我可以从com6上的接收器中检索数据。 我收到的数据是二进制的。 我想要的是将它转换为字符串,以便我可以切割部分字符串并单独解码它们。 我怎样才能做到这一点? 源代码在下面。 using System; using System.IO.Ports; using System.Threading; public class PortChat { static bool _continue; static SerialPort _serialPort; public static void Main() { string name; string message; StringComparer stringComparer = StringComparer.OrdinalIgnoreCase; Thread readThread = new Thread(Read); // Create a new SerialPort object with default settings. _serialPort = new SerialPort(); // Allow […]