在c#中将varbinary转换为DateTime



我在SQL Server表中有一个datetime列。我们需要加密它。因此,我在SSMS中将其转换为varbinary。我只是编辑了这个表,将datetime类型设置为varbinary,然后让SQL Server进行转换。接下来,我编写了简单的c#代码将其拉出,加密(使用中间层中的加密算法)并将其推回数据库。对名称和其他字符串类型的nvarchars做了相同的处理。

当我拉出加密的数据(使用NHibernate),我拉varbinary到一个字节[]和解密它。然后尝试将其转换回原始值。

nvarchar-as-varbinary列转换为fine;例如,我得到5个名字。

return Encoding.Unicode.GetString(source.FirstName);

然而,我很难把日期转换回原来的形式。我使用:

long ticks = BitConverter.ToInt64(source.DateOfBirth, 0);
return new DateTime?(new DateTime(1980, 1, 1).AddMilliseconds(ticks));

这似乎没有正确返回日期。将它转换回DateTime的正确方法是什么?

更新:请求样例值。最初为1/1/1901的日期时间在解密时产生一个byte[],其中byte[2]=1, byte[3]=109,其他都是0。另一个日期时间' 194104-26 '在解密时产生byte[2]=58和byte[3]=242。

日期存储为从1900-01-01开始的天数。

的例子:

byte[] data = {0,0,58,242};
if (BitConverter.IsLittleEndian) {
  Array.Reverse(data);
}
int days = BitConverter.ToInt32(data, 0);
DateTime date = new DateTime(1900, 1, 1).AddDays(days);
Console.WriteLine(date);
输出:

1941-04-26 00:00:00
Int64 ticks = BitConverter.ToInt64(source.DateOfBirth, 0);
DateTime dt = DateTime.FromBinary(ticks);

在您解密varbinary数据之后,您可以获得字符串值并通过SSMS运行它吗?比如:

SELECT CONVERT(datetime, 0x0000A149016D7FD9)

你的varbinary数据在SQL Server中看起来像什么?我怀疑翻译中有什么地方出错了。

好运。

相关内容

  • 没有找到相关文章

最新更新