Function Verify(ByVal VerifyString As String) As String
校验规则:
第一个字节与字节“00”异或,结果与第二个字节异或,以此类推,至最后一个字节,并将最后异或结果表达为16进制ASCII字符
例:
bn012000000000012008-01-15 20:42:3000c3@@@SO2,0,,BB,;NOx,0,,BB,;烟尘,0,,BB,;动压,0,,BB,;温度,0,,BB,;静压,0,,BB,;O2,0,,BB,;流速,0,;H2O,6.5,;流量,0,;过量空气系数,1,;SO2折算,0,;NOx折算,0,;烟尘折算,0,;SO2排放率,0,;NOx排放率,0,;烟尘排放率,0,;tek
其校验码为:20 Dim ChkXor = Encoding.Default.GetBytes(VerifyString)
Dim len As Integer = ChkXor.Length
Dim i As Integer
Dim ChkXorResult = "00"
Dim curByte As Byte
For i = 0 To len - 1
curByte = ChkXor(i)
If curByte <> 0 Then
ChkXor(i) = CByte(curByte Xor ChkXorResult)
End If
ChkXorResult = ChkXor(i)
Next i
Verify = Hex(ChkXorResult)
End Function
因为Oracle中创建table时,指定的字段的长度是按照字节数来计算的,所以在VB.NET中,想要控制insert的字段值的长度不超长,就需要一个对字符串进行截取。
例如:我们某个字段A的属性为VARCHAR2(100), 故最多只能存储100字节长度的字符串。当我们存入一个字符串,含有100个字符,但是(按照UTF8编码方式)其中有一个汉字(占3字节)或者西文字符(如ó,占2字节)时,这个字符串的字节长度就超过100,insert就不成功。
为此,我们通常的做法是先将该字符串进行一个截取,再insert,不过Substring在这里就达不到理想的效果了。本人在此提供一个按字符截取的function,仅供参考。
最简单的做法当然是对字符串做遍历,然后按字符一个一个的数,然后取得所需的长度。但是当一个字符串非常大的时候,这样数就会有performance的问题,所以,建议用二分法来做,即一半一半的取。
Function如下:
'''
''' 按字节截取字符串
'''
'''接收需要截取的字符串
'''需要截取的长度
'''
'''
Public Function strCutOut(ByVal p_str As String, ByVal p_len As Integer) As String
Dim strNew As String = String.Empty
Try
Dim intLenbyByte As Integer = System.Text.Encoding.UTF8.GetByteCount(p_str) '按照UTF8编码方式取得p_str的字节数
If intLenbyByte <= p_len Then
strNew = p_str
Return strNew
End If
Dim intWholeLenByCha As Integer = p_str.Length '按字符个数计算总长度
Dim intWholeLenByByte As Integer = 0 '按字符字节数计算总长度
Dim intHalfLenByCha As Integer = 0 '因为用的是二分法,所以存储每次所需取得的字符个数的一半
Dim intLastIndexByCha As Integer = 0 '上一次计算时的字符的个数
For i = 0 To p_str.Length - 1
If i = 0 Then
strNew = p_str.Substring(0, intWholeLenByCha / 2)
intHalfLenByCha = intWholeLenByCha / 2
Else
strNew = p_str.Substring(0, i)
End If
If intWholeLenByByte = p_len Then
Return strNew
ElseIf intWholeLenByByte < p_len Then
intLastIndexByCha = i
intHalfLenByCha = (intWholeLenByCha - (i + 1)) / 2 '总字符长度需要减的字符个数应该是index i +1
i = i + intHalfLenByCha
Else
If intLastIndexByCha = i - 1 Then '满足if条件时表明特殊字符占多个字节,且刚好卡在临界位
strNew = p_str.Substring(0, intLastIndexByCha)
Return strNew
End If
i = intLastIndexByCha + intHalfLenByCha / 2
intHalfLenByCha = intHalfLenByCha / 2
End If
Next
Return strNew
Catch ex As Exception
Return ex.ToString
End Try
End Function