sql >> Database >  >> RDS >> Sqlserver

SQL Server varbinary bigint met BitConverter.ToInt64-waarden zijn anders

Casten vanuit varbinary naar bigint (en terug) gebruikt netwerkbytevolgorde (big-endian).BitConverter gebruikt de endian-heid van de machine waarop deze draait (little-endian voor x86 en x64).

Vandaar BitConverter.GetBytes uitgevoerd op -8588797048854775808 (0x88CE7696E7167800) is {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77}, en cast op {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77} is 0x0088E91869893177 =38536887891734903.

Het ligt voor de hand om in de eerste plaats 64-bits gehele getallen op te slaan als 64-bits gehele getallen.

Als je deze conversie echt moet doen:

var savedValue = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(longValue))

Zal de bytes omwisselen, terwijl het ook draagbaar is omdat het de bytes niet zal verwisselen als het op een big-endian-machine wordt uitgevoerd.

Als alternatief, als u de System.Net-naamruimte om de een of andere reden niet wilt gebruiken, of als u uitbreidbaar wilt zijn naar andere typen dan de drie IPAddress.HostToNetworkOrder handeles, gebruik:

var savedValue = BitConverter.GetBytes(longValue);
if(BitConverter.IsLittleEndian)
  Array.Reverse(savedValue);



  1. Hibernate samenvoegen met twee tabellen en alle records ophalen?

  2. Waarom werkt mijn Postgres-database een tijdje en kan de server niet worden gestart nadat deze opnieuw is opgestart?

  3. MYSQL Query &PHP - Query geeft nul terug aan IOS App

  4. spring-boot web-app verliest na een tijdje de mogelijkheid om verbinding te maken met MySQL / RDS