访问卡遗留应用程序的一个功能是将数字转换为二进制并将其存储在MS SQL DB字段类型binary(9)
中。该字段包含Wiegand 26位格式卡号,可存储的最大数字为65535。
我们没有遗留应用程序源代码。
当我们使用select cast(number as binary(9))
将数字转换为二进制时,当应用程序转换它时,结果之间存在差异。
示例: 38741
传统应用:
0x000000000055970000
select cast(38741 as binary(9))
:
0x000000000000009755
我可以在输出差异中看到某种模式。以下是一些样本:
<table>
<tr>
<th>Number</th>
<th>LegacyAppOutput</th>
<th>SqlCastValue</th>
</tr>
<tr>
<td>38741</td>
<td>0x000000000055970000</td>
<td>0x000000000000009755</td>
</tr>
<tr>
<td>27250</td>
<td>0x0000000000726A0000</td>
<td>0x000000000000006A72</td>
</tr>
<tr>
<td>27249</td>
<td>0x0000000000716A0000</td>
<td>0x000000000000006A71</td>
</tr>
<tr>
<td>27248</td>
<td>0x0000000000706A0000</td>
<td>0x000000000000006A70</td>
</tr>
</table>
&#13;
是否有任何函数(在C#的SQL中)执行像遗留应用程序那样的数字到二进制?
答案 0 :(得分:1)
您只需要更改数字的字节顺序即可。以下是如何执行此操作的示例: http://www.csharp-examples.net/reverse-bytes/。 不幸的是,没有办法做到这一点。
答案 1 :(得分:0)
此问题背后的原因
小端和大端的区别(其中sql server是big-endian,遗留应用程序输出是little-endian)。感谢ZLK&amp; michauzo为小费。
<强>解决方案强>
您应该以相同的方式进行转换(数字到二进制和二进制到数字)。即。两者都应该在sql或应用程序开发中完成。在sql和应用程序开发中的其他转换中进行一次转换时会出现问题。
所以我如何获得所需的数字。
byte [] intAsBytes = BitConverter.GetBytes(cardNo); //生成little-endian。
然后向数组//特定要求插入5个字节以与传统输出匹配。
然后直接保存到SQL DB。
对于那些想要了解Big和Little Endian字节顺序的人:https://betterexplained.com/articles/understanding-big-and-little-endian-byte-order/