【问题标题】:String to byte[] and byte[] to Image in .NET.NET 中的字符串到 byte[] 和 byte[] 到 Image
【发布时间】:2013-09-07 04:51:41
【问题描述】:

我正在使用NITGEN's Fingkey Hamster DX 捕获指纹。

我已将指纹数据转换为文本格式,该格式为我提供如下字符串(以下代码中的字符串“sr”给出此字符串):

AQAAABQAAAAEAQAAAQASAAEAZAAAAAAA * AAAAOHbWlAewfLK7kOnScKzeN5HMVcDmjce0KPkeqyeiWEdTnJutHvnhyrnkW9OPbQNQc7 / 94lnozdd3Zz8RKiRSj8HHdCMZ8XIdaCy0tCxp2wLwRbVrHl14QkJlQMGqeJyzu06h / ZorwN5vVoxuzFDM9dKyqlm85XHuOeoeACxO / xZrE3NdH4aesbYWgy2i5Cru2AHymemLVeu7BX5BRgFkRrx6JzcZpW9Jn0r3GOkdSqGZG85soUxNX4GN * 4gJlqjfCg81cDZAi5NqiEosZjJUXwZ2677ll3OCOUaS31 / 7v7qF9NN1XdlNc1hrI8kQfmtbRNM3EOybwAoFTHG76rqRos P>

我尝试使用以下代码将此字符串转换为 byte[] 数组:

textFIR = new NBioAPI.Type.FIR_TEXTENCODE();
UInt32 r = m_NBioAPI.GetTextFIRFromHandle(hCapturedFIR, out textFIR, true);

string sr = "";
if (textFIR != null)
{
    sr = textFIR.TextFIR;
    byte[] src = new byte[sr.Length*sizeof(char)];

    System.Buffer.BlockCopy(sr.ToCharArray(),0,src,0,src.Length);
    MemoryStream ms = new MemoryStream(src);
    System.Drawing.Image FP = System.Drawing.Image.FromStream(ms);
    FP.Save("G:\\TempFP.Jpeg", ImageFormat.Jpeg);
}

但在Image.FromStream(ms) 上,我收到“参数无效”。例外。

【问题讨论】:

  • “我已将指纹数据转换为文本格式” - 指纹数据的开头是什么类型?一个字节数组?
  • 不,他们不提供简单的字节数组。他们希望用户只玩他们的 TYPES。
  • 我正在使用 NITGEN 的 NITGEN.SDK.NBioBSP..指纹数据类型是“NBioAPI.Type.HFIR hCapturedFIR”。而 "m_NBioAPI.Capture(out hCapturedFIR, NBioAPI.Type.TIMEOUT.DEFAULT, m_WinOption)" 这一行给出了 hCapturedFIR。

标签: c# .net fingerprint


【解决方案1】:

虽然我对您使用的特定库没有经验,但我可以看到您的代码存在一些明显的问题,并认为它们会导致问题。检查这两行代码:

string sr = "";
byte[] src = new byte[sr.Length*sizeof(char)];

sr此时是一个空字符串,所以 sr.Length 将为零,字节数组也将为零长度,因此BlockCopy 将无法向其写入任何内容。您应该将第二行移到if 块内,在sr = textFIR.TextFIR; 行之后。

【讨论】:

  • 感谢dotNET的回复。
  • 我尝试了你让我做的事情。但它仍然给了我同样的例外。参数无效。
  • 我不确定。因为 textFIR 是将实际指纹数据 (NBioAPI.Type.HFIR) 编码为文本的对象。
  • 我刚刚浏览了他们的文档 (nitgen.com.br/download/…)。看起来它不仅仅是简单地转换为内存流。他们没有提到他们使用的确切图像格式。
  • 对这个 dotNET 有任何想法吗?自上周以来,我一直坚持这一点。非常感谢您的帮助。
【解决方案2】:

TextFIR 成员中的文本既不是有效的 base64 编码数据,也不是图像数据。 它是一个多字节的文本数据,用于存储和与其他 FIR 进行验证。

使用 NImgConv.dll 中的 API 从 FIR 数据中获取图像。

【讨论】:

  • 但是 NImgConv.dll 是用 cpp 和 delphi 编写的。我没有它的 c# 类。我的 SDK 版本是 3.12。它不包括用于此的 c# 类。你在c#中做过这个吗?如果你这样做了,你可以给我一个示例代码吗?
  • 如果是 COM 组件,则 regsvr32 NImgConv.dll 并在 VS 的 COM 选项卡中添加 ref 否则按照说明stackoverflow.com/questions/569603/…
  • 我是 .NET 和开发领域的新手。我尝试了 regsvr32 NImgConv.dll 并收到以下错误:模块“NImgConv.dll”已加载,但未找到入口点 DllRegister。确保 NImgConv.dll 是有效的 DLL 或 OCX 文件,然后重试。任何想法?我没有得到第二个选项。
  • 它可能不是 COM 组件;尝试按照 url stackoverflow.com/questions/569603/… 中的说明进行操作
  • 很抱歉,我什至没有在我的 VS 中创建 C++/CLI 项目的选项。我对此完全陌生。
【解决方案3】:

您应该尝试FromBase64string 方法将其转换为字节数组。

public static  byte[] StringToBytes(string streamString)
{
   return Convert.FromBase64String(streamString);
}

为了确保你的 base64string 是有效的,你可以像这样检查它

<img alt="" src="data:image/jpeg;base64,**your base 64 string**" />

查看this链接了解更多信息。

【讨论】:

  • 尝试执行此操作时遇到以下异常:输入不是有效的 Base-64 字符串,因为它包含非 base 64 字符、两个以上的填充字符或非空格填充字符中的字符。
【解决方案4】:

我认为你得到的字符串是 Base64 格式的,所以你可以使用这个函数将你的字符串转换为 Bytes[],然后使用另一个函数将 Bytes[] 转换为图像。

    internal bool SaveBytesToFile(string fileFullPath, byte[] stream)
    {
        if (stream.Length == 0) return false;
        try
        { 
            try
            {
                using (FileStream fileStream = System.IO.File.Create(fileFullPath, (int)stream.Length))
                {
                    fileStream.Write(stream, 0, stream.Length);
                }
            }
            catch (Exception ex)
            {
                //Write Error log
                errorhandler.Write(ex);
                return false;
            }

            return true;
        }
        catch (Exception ex)
        {
            //Write Error log
            errorhandler.Write(ex);
            return false;
        }

    }

    internal byte[] StringToBytes(string streamString)
    {
        return Convert.FromBase64String(streamString);
    }

    internal string BytesToString(byte[] stream)
    {
        return Convert.ToBase64String(stream);
    }

【讨论】:

  • 我无法将此字符串转换为字节数组。尝试执行此操作时出现以下异常:输入不是有效的 Base-64 字符串,因为它包含非 base 64 字符、两个以上的填充字符或填充字符中的非空白字符
猜你喜欢
  • 2013-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-12
  • 1970-01-01
  • 2010-12-25
  • 2013-04-20
相关资源
最近更新 更多