会社で指紋照合システムを使用していますが、
現在は保存された指紋ファイルを照合に使っています。
セキュリティを考量し、ファイルのバイト配列をMariaDBにインサートし、
指紋チェック時に、DBに接続してバイナリで読みだして照合することにしました。
が、インサートしたデータを、VBで取得すると、
なぜかバイト配列の中身が、ASCIIコードになってしまっているのです。
もともとは 0,7 ~ → 48,55 ~
????? 何をやってもアスキーコードしか返ってきません。
どうしてでしょうか。
仕方がないので、数値に変換することにしました。
DBにインサートするサンプル ポイントを赤字で表示しています。
'''ファイルをバイナリで読み込む
Private Function RaeadBinary(ByVal filePath As String) As Byte()
Dim fs As New FileStream(filePath, FileMode.Open, FileAccess.Read)
Dim fileSize As Integer = CInt(fs.Length) ' ファイルのサイズ
Dim buf(fileSize - 1) As Byte ' データ格納用配列
Dim readSize As Integer ' Readメソッドで読み込んだバイト数
Dim remain As Integer = fileSize ' 読み込むべき残りのバイト数
Dim bufPos As Integer = 0 ' データ格納用配列内の追加位置
While remain > 0
' 1024Bytesずつ読み込む
readSize = fs.Read(buf, bufPos, Math.Min(1024, remain))
bufPos += readSize
remain -= readSize
End While
Return buf
End Function
’’’読み取ったバイナリデータを16進表現に変換する
Private Function Get16Dump(ByVal val() As Byte) As String
Dim s As String
s = BitConverter.ToString(val)
Return s
End Function
Public Function GetInsertValBinary16(ByVal filePath As String) As String
Dim val() As Byte = Me.RaeadBinary(filePath)
Dim StrVal16 As String = Get16Dump(val)
Return StrVal16
End Function
'' '指紋データをDBにインサートする
Public Function InsertSimon(ByVal simonStr As String) As Boolean
Try
Dim sql As New System.Text.StringBuilder()
sql.AppendLine("INSERT INTO ~ (")
・・・・・・・・・・・・・・・・・
sql.AppendLine(")VALUES(")
sql.AppendLine("@simdat,")
sql.AppendLine("@created_at,")
sql.AppendLine("@updated_at")
sql.AppendLine(");")
Dim myParams As New List(Of MySqlParameter)
Dim myParam_simdat As New MySqlParameter("@simdat", MySqlDbType.Blob)
Dim myParam_createdat As New MySqlParameter("@created_at", MySqlDbType.DateTime)
Dim myParam_updatedat As New MySqlParameter("@updated_at", MySqlDbType.DateTime)
myParam_simdat.Value = simonStr
myParam_createdat.Value = DateTime.Now()
myParam_updatedat.Value = DBNull.Value
myParams.Add(myParam_simdat)
myParams.Add(myParam_createdat)
myParams.Add(myParam_updatedat)
Dim result As Boolean = ExecuteSQLNonQuery(sql.ToString(), myParams)
If result Then
Return True
Else
Return False
End If
Return True
Catch ex As Exception
MessageBox.Show(ex.Message)
Return False
End Try
End Function
'''SQLを実行するメソッド
Public Function ExecuteSQL(ByVal sql As String, Optional ByVal params As List(Of MySqlParameter) = Nothing) As DataTable
Try
Connect()
Dim Table As New DataTable("Table")
Dim cmd As New MySqlCommand(sql, _Connection)
If Not params Is Nothing Then
For Each p As MySqlParameter In params
cmd.Parameters.Add(p)
Next
End If
Dim DataAdapter As New MySqlDataAdapter(cmd)
DataAdapter.Fill(Table)
Return Table
Catch ex As Exception
MessageBox.Show(ex.Message)
Return Nothing
Finally
Close()
End Try
End Function
'''DBに接続するメソッド
Private Function Connect()
Try
Dim ConnectionString As String = ~
_Connection = New MySqlConnection()
_Connection.ConnectionString = ConnectionString
_Connection.Open()
Return True
Catch ex As Exception
MessageBox.Show(ex.Message)
Return False
End Try
End Function
'''DB接続を閉じる
Private Sub Close()
Try
_Connection.Close()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
'''登録ボタン
Private Sub RegistButton_Click(sender As Object, e As EventArgs) Handles RegistButton.Click
Dim byteStr16 As String = rep.GetInsertValBinary16(_filePath)
Dim result As Boolean = rep.Insert(byteStr16, SimonTable.Rows(i))
If result = False Then
MessageBox.Show("登録に失敗しました。", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error)
End If
MessageBox.Show("登録が完了しました。", "OK", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)
End Sub
取得して照合はまた次回にします。