.NET中字符串转换为字节数组和字节数组转换为图像

3

我正在使用NITGEN的Fingkey Hamster DX来获取指纹。

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

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

我已尝试使用以下代码将此字符串转换为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)处我得到了“参数无效”的异常。


可能是重复的问题:.NET String to byte Array C# - slugster
另外:http://stackoverflow.com/q/14360257/109702,https://dev59.com/gmbWa4cB1Zd3GeqPZrd9。 - slugster
我已将指纹数据转换为文本格式。- 指纹数据最初是什么类型?一个字节数组吗? - Mitch Wheat
不,他们没有提供一个简单的字节数组。他们希望用户只使用他们的类型。 - Touhid K.
我正在使用NITGEN的NITGEN.SDK.NBioBSP。指纹数据类型为“NBioAPI.Type.HFIR hCapturedFIR”。而“m_NBioAPI.Capture(out hCapturedFIR, NBioAPI.Type.TIMEOUT.DEFAULT, m_WinOption)”这行代码会返回hCapturedFIR。 - Touhid K.
显示剩余4条评论
4个回答

1

虽然我没有使用你所用的特定库的经验,但我可以看出你的代码存在一些明显的问题,我认为这些问题可能导致了这个问题。请检查你代码中的这两行:

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

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


我按照你告诉我的做法尝试了一下,但仍然出现相同的异常。参数无效。 - Touhid K.
我不确定那个..因为textFIR是一个对象,将实际指纹数据(NBioAPI.Type.HFIR)编码为文本。 - Touhid K.
有关dotNET方面的任何想法吗?我被困在这个问题上已经一周了。如果你能帮忙,我会非常感激。 - Touhid K.
尝试一下Tejas的想法。我手头没有硬件或软件,所以对我来说有点难以进行实验。 - dotNET

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

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


但是NImgConv.dll是用cpp和delphi编写的。我没有它的c#类。我的Sdk版本是3.12,它不包括这个的c#类。你有用c#做过吗?如果你已经做过,能否给我发送一个示例代码? - Touhid K.
如果这是一个COM组件,那么请执行regsvr32 NImgConv.dll命令,并从VS的COM选项卡中添加引用。否则,请按照以下指示操作:https://dev59.com/73RB5IYBdhLWcg3wn4bb - Vijay Sirigiri
我是.NET和开发领域的新手。我尝试了regsvr32 NImgConv.dll,但出现了以下错误:模块“NImgConv.dll”已加载,但未找到入口点DllRegister。请确保NImgConv.dll是有效的DLL或OCX文件,然后重试。有什么想法吗?我没有得到第二个选项。 - Touhid K.
它可能不是一个COM组件;请尝试按照网址https://dev59.com/73RB5IYBdhLWcg3wn4bb中的说明操作。 - Vijay Sirigiri
很抱歉,但我在我的VS中甚至没有创建C++/CLI项目的选项。我完全是新手。 - Touhid K.
好的,我明白了。我需要创建一个类库项目。我已经创建了它。但是如何使其依赖于非托管 DLL? - Touhid K.

0
你应该尝试使用FromBase64string方法将其转换为字节数组。
public static  byte[] StringToBytes(string streamString)
{
   return Convert.FromBase64String(streamString);
}

为确保您的base64字符串有效,您可以像这样进行检查

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

查看此链接this以获取更多信息。


我在尝试执行此操作时遇到了以下异常: 输入不是有效的Base-64字符串,因为它包含一个非Base-64字符、超过两个填充字符或填充字符中有一个非空格字符。 - Touhid K.

0

我认为你得到的字符串是以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字符,超过两个填充字符或填充字符中有一个非空格字符。 - Touhid K.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接