当前位置: 首页 > 知识库问答 >
问题:

C#对象类型转换为Byte[],通过TCP发送并转换回double

殷耀
2023-03-14
TcpClient                   _client;
NetworkStream               _stream = null;
byte[]                      _data = new byte[8192];

{...}
try
{
    _client     = new TcpClient(properties.IpAddress, properties.Port);
}
{...}
    try
    {
        _stream     = _client.GetStream();
{...}
        int NumBytesInRecvBuffer = _stream.Read(_data, 0, 8192);

{...}
            if(_data[3] == paramCount)
            {
                for(int i = 0; i < paramCount; i++)
                {
                    double Value = MakeDouble(_data, 4+(i*8));
                    fmacsParams[i].NumericalValue = Value;
                }
            }
    }
private unsafe double MakeDouble(byte[] data, int StartIndex)
{
    double result;
    byte* b = (byte*)&result;
    b[0] = data[StartIndex + 7];
    b[1] = data[StartIndex + 6];
    b[2] = data[StartIndex + 5];
    b[3] = data[StartIndex + 4];
    b[4] = data[StartIndex + 3];
    b[5] = data[StartIndex + 2];
    b[6] = data[StartIndex + 1];
    b[7] = data[StartIndex + 0];
    return(result);         
}
 object ft107Flow = oType.InvokeMember("GetValue", System.Reflection.BindingFlags.InvokeMethod, null, wincc, new object[] { "FT107_Flow" });
{...}
const int paramCount = 30;
double[] WinCC_Tags = new double[paramCount];

WinCC_Tags[0] = Convert.ToDouble(ft107Flow);
{...}
byte[] data = new byte[4 + paramCount * 8];
Array.Clear(data, 0, data.Length);

byte[] UnswappedByte;
byte[] SwappedByte;

data[3] = paramCount;

for (int i = 0; i < paramCount; i++)
{
     int j;

     UnswappedByte = BitConverter.GetBytes(WinCC_Tags[i]);
     SwappedByte = SwapBytes(UnswappedByte, 0);

     j = (4 + i * 8);

     data[j] = SwappedByte[0];
     data[j + 1] = SwappedByte[1];
     data[j + 2] = SwappedByte[2];
     data[j + 3] = SwappedByte[3];
     data[j + 4] = SwappedByte[4];
     data[j + 5] = SwappedByte[5];
     data[j + 6] = SwappedByte[6];
     data[j + 7] = SwappedByte[7];
}

例如,在WinCC运行时中,标记值为15.3。当转换为double时,它等于15.30000190734863。则数据[12..19]={0x40,0x2E,0x99,0x99,0xA0,0x00,0x00,0x00}

客户端收到的数据如下:

_data[12..19]={0x40,0x2E,0x99,0x99,0xA0,0x00,0x00,0x00}

共有1个答案

程俊力
2023-03-14
using (MemoryStream stream = new MemoryStream())
using (BeBinaryReader BeReader = new BeBinaryReader(stream))
{
    stream.Position = 3;
    if(BeReader.ReadByte() == paramCount)
    for (int i = 0; i < paramCount; i++)
    {
       double Value = BeReader.ReadDouble();
       fmacsParams[i].NumericalValue = Value;
    }
 }
 类似资料:
  • 问题内容: 有没有一种方法可以将对象强制转换为方法的返回值?我尝试过这种方式,但在“ instanceof”部分给出了编译时异常: 我也尝试过这个,但是它给出了运行时异常ClassCastException: 有没有一种简便的方法可以做到这一点: 编辑:我写了正确答案的工作副本: 问题答案: 您必须使用实例,因为在编译过程中会擦除通用类型。 该方法的声明是: 这也可以用于数组类型。它看起来像这样:

  • 问题内容: 在Java中,从Object转换为其他类型时,为什么第二行会产生与转换相关的警告,而第一行却没有? 问题答案: 这是因为在执行时,由于 类型Erase 不会 真正 检查对象是否为a 。真的只是将其投射到。例如: __ 有关更多信息,请参见Angelika Langer的Java泛型常见问题解答 ,尤其是类型擦除部分。

  • 主要内容:强制对象类型转换将一个类型强制转换成另一个类型的过程被称为类型转换。本节所说的 对象类型转换,是指存在继承关系的对象,不是任意类型的对象。当对不存在继承关系的对象进行强制类型转换时,会抛出 Java 强制类型转换(java.lang.ClassCastException)异常。 Java 语言允许某个类型的引用变量引用子类的实例,而且可以对这个引用变量进行类型转换。Java 中引用类型之间的类型转换(前提是两个类

  • 问题内容: 好吧,如果我有这段代码 一切正常,但是 运行后给出以下错误(Eclipse没有给出任何错误) 虽然,当我这样做 要么 再没有错了。 为什么必须将其首先转换? 问题答案: 声明对象时,可以通过检查对象是否实际上已强制转换为实例来判断。由于取消装箱约定,可以再次将其强制转换为。之后,该值可以转换为。 但是,没有从Double实例转换为的取消装箱约定,因此,如果您尝试这样做,则运行时将发出。

  • 问题内容: 我有一个byte.Buffer,我使用binary.Write()函数包装了数据。然后,我需要将此字节数组发送到C函数。使用Go 1.6时,我未能成功解决这一问题。 它在调用C函数的行上失败: C函数: 我能够使以下内容正常工作,但将字节数组转换为字符串感觉不对。有一个更好的方法吗?这种方法是否会对数据产生副作用? 同样,这需要在Go 1.6(引入了更严格的cgo指针规则)下工作。 谢

  • 问题内容: 我有一个JSON对象,我将其转换为并在此处进行一些处理。稍后,我想转换相同的缓冲区数据以转换为有效的JSON对象。 我正在研究Node V6.9.1 下面是我尝试过的代码,但是当我转换回JSON却无法打开该对象时遇到了。 所以我尝试使用检查方式打印整个对象 如果我尝试像数组一样读取它 我也尝试解析它抛出 我需要将其视为我创建的真实对象(我的意思是像上面声明的那样)。 请帮忙.. 问题答