Announcement

Collapse
No announcement yet.

long von int subtrahieren ??

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • long von int subtrahieren ??

    Code:
     public string GetVolumeSerial(string strDriveLetter)
            {
                uint serNum = 0;
                uint maxCompLen = 0;
                StringBuilder VolLabel = new StringBuilder(256);	// Label
                UInt32 VolFlags = new UInt32();
                StringBuilder FSName = new StringBuilder(256);	// File System Name
                strDriveLetter += "\\";
                long Ret = GetVolumeInformation(strDriveLetter, VolLabel, (UInt32)VolLabel.Capacity, ref serNum, ref maxCompLen, ref VolFlags, FSName, (UInt32)FSName.Capacity);
                
                return Convert.ToString(serNum);
            }
    Mein Code funktioniert soweit - habe ich als Snipet eingebunden.
    Leider wird der Wert irgendwann zu groß, so das ich ihn gern convertieren möchte.

    Er berechnet die VolumenSerienNummer einer Partition utner Windows.

    Jetzt benötige ich folgende Umrechnung bevor der Wert 'returned' wird.
    Code:
                // convert
                 if (serNum > 2147483648)   serNum -= 4294967296;
    Als Fehler erhalte ich:
    Fehler 2 Der Typ "long" kann nicht implizit in "uint" konvertiert werden. Es ist bereits eine explizite Konvertierung vorhanden. (Möglicherweise fehlt eine Umwandlung.)

    Jetzt stehe ich etwas auf dem Schlauch . Danke für eure Hilfe!

  • #2
    Komisch ist eigentlich, das der uint größer wird als er eigentlich werden darf.
    Woran liegt das - er darf doch maximal 4294967295 als Wert bekommen oder?

    Nun läuft mein COde so ordnungsgemäß:

    Code:
    public string GetVolumeSerial(string strDriveLetter)
            {
                uint serNum = 0;
                uint maxCompLen = 0;
                StringBuilder VolLabel = new StringBuilder(256);	// Label
                UInt32 VolFlags = new UInt32();
                StringBuilder FSName = new StringBuilder(256);	// File System Name
                strDriveLetter += "\\";
                long Ret = GetVolumeInformation(strDriveLetter, VolLabel, (UInt32)VolLabel.Capacity, ref serNum, ref maxCompLen, ref VolFlags, FSName, (UInt32)FSName.Capacity);
    
                long long_serNum = Convert.ToInt64(serNum);
                if (long_serNum > 2147483648)
                {
                    long_serNum -= 4294967296; 
                }
    
                return Convert.ToString(long_serNum);
            }

    Comment


    • #3
      Code:
                   if (serNum > 2147483648)   serNum -= 4294967296;
      das Literal 4294967296 ist zu groß für uint der geht nur bis 4294967295. Also wird der Wert zu einem long. Und implizit ~runtercasten~ ,von long(64bit) nach int(32bit), für die Subtraktion darf man nicht wegem den möglichen Verlusten.

      Komisch ist eigentlich, das der uint größer wird als er eigentlich werden darf.
      Das kann er auch nicht. Irgendwo legst du dich rein. Wo willst du den gesehen haben das er größer ist?

      Comment


      • #4
        Danke für deine Antwort.

        Das kann er auch nicht. Irgendwo legst du dich rein. Wo willst du den gesehen haben das er größer ist?
        Habe es in einem kleinen Tool benutzt und der Wert ist definitiv größer.
        Mit meiner Lösung oben bin ich jedoch erst einmal weiter gekommen.

        Das kleine Tool steht hier bereit - ist aber nur für einen kleinen SQL Update zuständig.

        http://www.mediamonkey.com/forum/vie...181034#p181034

        Comment


        • #5
          Es könnte auch über WMI Ermittelt werden
          [highlight=c#]

          var mediaClass = new ManagementClass( "Win32_PhysicalMedia" );
          ManagementObjectCollection mediaList = mediaClass.GetInstances();
          var nameList = new List<String>();
          var serialNumberList = new List<String>();
          foreach ( ManagementObject medium in mediaList )
          {
          PropertyDataCollection mediumProperties = medium.Properties;
          String tag = "";
          String serialNumber = "";
          foreach ( PropertyData property in mediumProperties )
          {
          if ( property.Name.Equals( "Tag" ) )
          tag = property.Value.ToString();
          if ( property.Name.Equals( "SerialNumber" ) )
          {
          try
          {
          serialNumber = property.Value.ToString().Trim();
          }
          catch ( Exception )
          {
          serialNumber = "?";
          }
          }
          }

          nameList.Add( tag );
          serialNumberList.Add( serialNumber );
          }
          [/highlight]
          Zuletzt editiert von vadym voytas; 01.10.2009, 22:25.
          Bitte vergessen Sie nicht die Antwort zu bewerten. Danke.:-)

          Comment


          • #6
            Danke für den Hinweis und den Code. Schaue ich mir auch mal an!

            Comment

            Working...
            X