蜡笔小欣丫 2024-07-29 13:59 采纳率: 0%
浏览 8

读取二进制文件,处理二进制数据和字符串,最后全部转换为字符串


var tt=msg.payload[0].payload;
var shotCurveName = tt.slice(12,93).toString().replace(/\0/g, ‘’);//曲线名称
var dataAndTime = tt.slice(93, 107).toString().replace(/\0/g, ‘’);//时间
let buf1 = tt.slice(176, 180);
var duration = buf1.readFloatLE(0); //曲线毫秒值
var team=tt.slice(180,261).toString().replace(/\0/g, ‘’); //组
var number=tt.slice(264,268).readInt32LE(0); //序列号
var recipe=tt.slice(268,349).toString().replace(/\0/g, ‘’); //曲线配方
var result = tt.slice(350, 352).readInt16LE(0); //曲线品质
var shotResultWayCurveInjectionClinder=[]; //位移
var shotResultInjectionCylinderPistonPressureCurve = []; //入口压力
var shotResultInjectionCylinderAnnulusPressureCurve = []; //出口压力
var shotResultPNaccCurve = []; //氮气压力
var shotResultSpoolPositionInletAnnularValveCurve = []; //V1阀芯反馈开度
var shotResultSpoolPositionOutletAnnularValveCurve = []; //V2阀芯反馈开度
var shotResultSpeedCurveInjectionCylinder = []; //速度
var shotResultMetalPressureCurve = []; //铸造压力
var shotTargetPressureCurve = []; //目标压力
var shotTargetSpeedCurve = []; //目标速度
var shotTargetWayCurveInjectionCylinder = []; //目标位置 /料管真空
var shotOpeningInletAnnularValveCurve = []; //V1阀芯设定开度 /动模真空
var shotOpeningOutletAnnularValveCurve = []; //V2阀芯设定开度 /定模真空


//曲线部分

for(var i=0;i<=30000;i++){


shotResultWayCurveInjectionClinder.push(tt.slice(352+i*4, 356+i*4).readFloatLE(0).toFixed(1));
shotResultInjectionCylinderPistonPressureCurve.push(tt.slice(352 + 120004 + i * 4, 356+120004 + i * 4).readFloatLE(0).toFixed(1));
shotResultInjectionCylinderAnnulusPressureCurve.push(tt.slice(352 + 120004 * 2 + i * 4, 356+120004*2 + i * 4).readFloatLE(0).toFixed(1));
shotResultPNaccCurve.push(tt.slice(352 + 120004 * 3 + i * 4, 356 + 120004 * 3 + i * 4).readFloatLE(0).toFixed(1));
shotResultSpoolPositionInletAnnularValveCurve.push(tt.slice(352 + 120004 * 4 + i * 4, 356 + 120004 * 4 + i * 4).readFloatLE(0).toFixed(1));
shotResultSpoolPositionOutletAnnularValveCurve.push(tt.slice(352 + 120004 * 5 + i * 4, 356 + 120004 * 5 + i * 4).readFloatLE(0).toFixed(1));
shotResultSpeedCurveInjectionCylinder.push(tt.slice(352 + 120004 * 6 + i * 4, 356 + 120004 * 6 + i * 4).readFloatLE(0).toFixed(2));
shotResultMetalPressureCurve.push(tt.slice(352 + 120004 * 7 + i * 4, 356 + 120004 * 7 + i * 4).readFloatLE(0).toFixed(1));
shotTargetPressureCurve.push(tt.slice(352 + 120004 * 8 + i * 4, 356 + 120004 * 8 + i * 4).readFloatLE(0).toFixed(0));
shotTargetSpeedCurve.push(tt.slice(352 + 120004 * 9 + i * 4, 356 + 120004 * 9 + i * 4).readFloatLE(0).toFixed(2));
shotTargetWayCurveInjectionCylinder.push(tt.slice(352 + 120004 * 10 + i * 4, 356 + 120004 * 10 + i * 4).readFloatLE(0).toFixed(0));
shotOpeningInletAnnularValveCurve.push(tt.slice(352 + 120004 * 11 + i * 4, 356 + 120004 * 11 + i * 4).readFloatLE(0));
shotOpeningOutletAnnularValveCurve.push(tt.slice(352 + 120004 * 12 + i * 4, 356 + 120004 * 12 + i * 4).readFloatLE(0));

}
var curveArray=[];
var durationAr=[];
durationAr.push(duration);
curveArray.push(durationAr);
curveArray.push(shotResultSpeedCurveInjectionCylinder);
curveArray.push(shotResultWayCurveInjectionClinder);
curveArray.push(shotResultInjectionCylinderPistonPressureCurve);
curveArray.push(shotResultInjectionCylinderAnnulusPressureCurve);
curveArray.push(shotResultPNaccCurve);
curveArray.push(shotResultMetalPressureCurve);
curveArray.push(shotResultSpoolPositionInletAnnularValveCurve);
curveArray.push(shotResultSpoolPositionOutletAnnularValveCurve);
curveArray.push(shotTargetSpeedCurve);
curveArray.push(shotTargetPressureCurve);
curveArray.push(dataAndTime);
combineArray.push(curveArray);
combineArray.push(spcArray);
combineArray.push(array3);
msg.payload =JSON.stringify(combineArray);

上面是node-red中对二进制数据流的处理,现在我要上面代码的功能,然后在VS中,用C#来实现。

  • 写回答

1条回答 默认 最新

  • 何事_ 2024-07-29 13:59
    关注

    引自免费微信小程序:皆我百晓生

    要将上述Node-RED中的JavaScript代码转换为C#代码并在Visual Studio中实现,你需要对二进制数据进行解析和操作。下面是一个大致的C#代码示例,展示了如何读取二进制数据并执行类似于Node-RED中的操作。请注意,这个示例仅为了演示目的,你可能需要根据实际的二进制数据格式和内容进行修改。

    首先,假设你有一个包含二进制数据的文件或流。你可以使用FileStreamMemoryStream来读取数据。这里是一个简单的例子,展示了如何读取文件并处理数据:

    using System;
    using System.IO;
    using System.Linq;
    
    public class BinaryDataProcessor
    {
        public void ProcessBinaryData(string filePath)
        {
            // 打开文件流并读取二进制数据
            using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
            {
                byte[] buffer = new byte[fileStream.Length]; // 根据文件大小分配缓冲区
                fileStream.Read(buffer, 0, buffer.Length); // 读取文件内容到缓冲区
            }
            
            // 这里模拟tt变量,你需要根据实际情况处理二进制数据得到tt的值
            byte[] tt = /* your binary data processing logic to get tt */;
            
            // 处理二进制数据和字符串的转换逻辑开始
            // 模拟你的二进制数据切片操作(以float为例)
            float duration = BitConverter.ToSingle(tt, 176 * 4); // 假设每个float占用4个字节(即32位)
            string shotCurveName = System.Text.Encoding.UTF8.GetString(tt, 12, 81).Replace("\0", ""); // 曲线名称(假设字符串起始位置为第12个字节)
            string dataAndTime = System.Text.Encoding.UTF8.GetString(tt, 93, 14).Replace("\0", ""); // 时间(假设字符串起始位置为第93个字节)
            // 其他变量类似处理... (你需要确定每个数据的准确位置和大小)
            
            // 处理曲线数据部分(示例以处理部分曲线数组为例)
            var curves = new List<float[]>(); // 用于存储曲线数据的列表
            for (int i = 0; i <= 30000; i++) // 循环处理每条曲线数据(根据实际情况调整循环次数)
            {
                float[] curveData = new float[/*曲线数据大小*/]; // 创建存储单个曲线数据的数组(根据实际情况调整大小)
                // 这里需要将字节转换为浮点数并填充到curveData数组中... (需要根据实际的字节顺序和大小调整)
                curves.Add(curveData); // 将曲线数据添加到列表中
            }
            
            // 将处理后的数据组合成一个结构或对象(模拟combineArray等)... (根据你的需求调整逻辑)
            // ... 组合其他数据 ... 转换最终结果为JSON字符串等(类似Node-RED中的逻辑) ... 省略具体实现细节 ... 
        }
    }
    

    在上面的代码中,请根据实际情况替换/*你的二进制数据处理逻辑获取tt的值*/以及数组大小和偏移量等。对于不同大小和类型的字段,你可能需要使用不同的方法来解析字节序列,比如BitConverter类提供了一些用于解析字节序列的方法,如ToInt32ToSingle等。另外,确保正确处理字节顺序(大端序或小端序),如果需要的话可以进行转换。注意使用C#进行字节处理时务必明确数据类型和字节顺序以避免解析错误。这个代码是一个基础模板,根据你的实际需求和二进制数据格式进行修改和优化是关键。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 7月29日

悬赏问题

  • ¥30 靶向捕获测序探针设计自学
  • ¥15 写代码写代码单片机代码写代码写数字按键代码
  • ¥15 django按照距离进行排序
  • ¥15 (标签-微信|关键词-微信公众号)
  • ¥15 matlab中mjs用不了
  • ¥15 Ios抖音直播的时候如何添加自定义图片在直播间!
  • ¥60 riscv-pulpino总线上挂载axi从机
  • ¥15 ssh登录页面的问题
  • ¥50 关于在matlab上对曲柄摇杆机构上一点的运动学仿真
  • ¥15 jetson nano