如何在 C# 中从 HL7 消息中提取和解码 Base 64 位图编码字符串?

问题描述 投票:0回答:1

我有一个 C# 应用程序,在其中接收 HL7 消息并使用 NHAPI 库来解析它。 但我无法提取 Base 64 编码消息。

有什么方法可以提取 Base 64 位图消息吗? 我可以解码该字符串,但我需要正确格式的编码字符串。 我如何实现这一目标?

我尝试过以下方法

HL7 消息示例:

MSH|^~\&|xyz|abcd|||20240408201653||ORU^R01|10|P|2.3.1||||||UNICODE
PID|1||^^^^MR
PV1|1
OBR|1||129|00001^Automated Count^99MRC|||20240408150949|||||||||||||||||HM|NotValidated|||||||Service
OBX|1|IS|08001^Take Mode^99MRC||O||||||F
OBX|2|IS|08002^Blood Mode^99MRC||W||||||F
OBX|3|IS|08003^Test Mode^99MRC||CBC+DIFF+ESR||||||F
OBX|4|NM|751-8^NEU#^LN||5.32|10*9/L|2.00-7.00|N|||F
OBX|5|NM|731-0^LYM#^LN||3.92|10*9/L|0.80-4.00|N|||F
OBX|6|ED|15008^Bitmap One BMP^99MRC||^Image^BMP^Base64^Qk0OQgAAAAAAALYDAAAoAAAAlgAAAGkAAAABAAgAAAAAAAAAAADEDgAAxA4AAOAAAADgA=|||F
OBX|7|ED|15056^Bitmap two BMP^99MRC||^Image^BMP^Base64^Qk0OQgAAAAAAALYDAAAoAAAAlgAAAGkAAAABAAgAAAAAAAAAAADE=|||F

我的代码方法:

  string hl7Message = File.ReadAllText(filePath);
                    PipeParser parser = new PipeParser();
                    IMessage message = parser.Parse(hl7Message.Trim());
                    ORU_R01 oRU_R01 = message as ORU_R01;
                   
                    foreach (var observation in oRU_R01.PATIENT_RESULTs.FirstOrDefault()?.ORDER_OBSERVATIONs)
                    {
                       
                        foreach (var obx in observation?.OBSERVATIONs)
                        {
                            string description = "";
                            string result = "";
                            string abnormalFlag = " ";
                            if (obx.OBX.ValueType.Value == "NM")
                            {
                                description = obx.OBX.ObservationIdentifier.Text.Value;
                                result= obx.OBX.GetObservationValue(0).Data.ToString();
                                abnormalFlag = obx.OBX.GetAbnormalFlags(0).Value;
                                Updatetxtbx($" Parameter: {description}, Result: {result}, Flag: {abnormalFlag}");
                            }
                            else if(obx.OBX.ValueType.Value == "ED")
                            {
                                string observationIdentifier = obx.OBX.ObservationIdentifier.Text.Value;
                                string enData = obx.OBX.GetObservationValue(0).Data.ToString();
                                SaveBitmapFromBase64(enData, "C:\\" + DateTime.Now.ToString("yyyy-mm-ss") + ".bmp");
                                Updatetxtbx($"Base64 Encoded Data: {enData}");
                              
                            }
                        }
                    }

public void SaveBitmapFromBase64(string base64, string filePath)
        {
            try
            {
              
                 byte[] imageBytes = Convert.FromBase64String(base64);

                using (MemoryStream ms = new MemoryStream(imageBytes))
                {
                    Bitmap bitmap = new Bitmap(ms);
                    bitmap.Save(filePath, System.Drawing.Imaging.ImageFormat.Bmp);
                    log("Bitmap saved successfully.");
                }
            }
            catch (Exception ex)
            {
                log("Error saving bitmap: " + ex.Message);
            }
        }

我的方法 Savebitmapfrombase64 抛出错误:

The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or an illegal character among the padding characters. 

对此有什么想法

c# winforms bitmap base64 hl7
1个回答
0
投票

该行从 OBX-5 获取观测值:

string enData = obx.OBX.GetObservationValue(0).Data.ToString();
。例如,对于第七个 OBX 段,这将使
enData
等于“^Image^BMP^Base64^Qk0OQgAAAAAAALYDAAAoAAAAlgAAAGkAAAABAAgAAAAAAAAAAADE=”。这不是有效的 Base64 编码字符串。

您应该抓住该克拉分隔字符串的第五段并将该部分(在本例中为“Qk0OQgAAAAAAALYDAAAoAAAAlgAAAGkAAAABAAgAAAAAAAAAAADE=”)传递给

SaveBitmapFromBase64

© www.soinside.com 2019 - 2024. All rights reserved.