我正在使用SD卡,成功地从ic读取SID到vb.net.Problem来自我需要制造日期的代码。数据表说:
制造日期由两个十六进制数字组成,一个是8 表示年(y)的位和另一个表示4位的位 月(月)。 “m”字段[11:8]是月份代码。 1 = 1月。该 “y”字段[19:12]是年份代码。 0 = 2000.作为一个例子, 生产日期“2001年4月”的日期字段的二进制值将 是:00000001 0100。
下面这个并不难,最难的是创建一个代码,它会根据十六进制数字放置DateTime。例如,我接收0x00 0xAC [000000000000000010101100]我们只占12位(前4位保留),意味着[000010101100],前8位是一年0x0A = 10(DEC)= 2010,最后4位是一个mounth [1100 ] = 12(DEC),这意味着我们有12.2010生产日期。如何使用bit进行这种操作然后将结果放入DateTime?我通过serialport.readexisting在字符串表示中收到HEX。
答案 0 :(得分:1)
一种方法是使用BitArray()
将2个十六进制值转换为字节数组中的位表示
然后,使用Math.Pow()
,使用位位置将值转换为十进制表示
DateTime()
将Year和Month的十进制值转换为Date。
给出两个十六进制值0x00 0xAC:
Dim _sHexValue1 As String = "0x00"
Dim _sHexValue2 As String = "0xAC"
请注意,第一个字节设置为“0xAC”,第二个字节设置为“0x00”。
'Convert the two "Hex" strings to byte
Dim _Bytes As Byte() = {Convert.ToByte(_sHexValue2.Substring(2, 2), 16),
Convert.ToByte(_sHexValue1.Substring(2, 2), 16)}
'Convert the byte array in array of bits. => True means that the bit is on (1)
Dim _BitArray As New BitArray(_Bytes)
Dim _month As Integer = 0
Dim _year As Integer = 0
'Convert to decimal the value expressed by the first 4 bits
For x As Integer = 0 To 3
_month += If(_BitArray(x) = True, CType(Math.Pow(2, x), Integer), 0)
Next
'Convert to decimal the value expressed by bits 4-12
For x As Integer = 0 To 7
_year += If(_BitArray(x + 4) = True, CType(Math.Pow(2, x), Integer), 0)
Next
Dim _Date As New DateTime(_year + 2000, _month, 1)
'If the string representation is needed:
Dim _sDate As String = _Date.ToString("MM.yyyy")