Staredit Network > Forums > General StarCraft > Topic: Unsigned negative values???
Unsigned negative values???
Jan 1 2017, 10:24 am
By: iCCup.xboi209  

Jan 1 2017, 10:24 am iCCup.xboi209 Post #1



http://www.staredit.net/wiki/index.php/Scenario.chk#Sections

Quote
Invalid sections can exist and will be ignored. While Size is unsigned, it can safely be a negative value to read a chunk earlier in the file. This allows for "section stacking", allowing smaller sections to be placed inside of larger ones or duplicate triggers or units to take less space in the file.
So how can Size be negative if it's unsigned?



None.

Jan 1 2017, 2:40 pm jjf28 Post #2

Cartography Artisan

I assume the wiki means that so long as it's a u32, the addition overflow arithmetic is the same as if it were a s32, personally I just made it signed.

Code
bool Scenario::ParseScenario(buffer &chk)
{
   caching = false;
   u32 chkSize = chk.size();

   u32 position = 0,
       nextPosition = 0;

   bool parsing = true;

   do
   {
       if ( position + 8 < chkSize ) // Valid section header
       {
           if ( ParseSection(chk, position, nextPosition) )
               position = nextPosition;
           else // Severe data handling issue or out of memory
               return false;
       }
       else if ( position < chkSize ) // Partial section header
       {
           tailLength = (u8)(chkSize - position);
           if ( !chk.getArray<u8>(tailData, position, tailLength) )
               return false;

           mapIsProtected = true;
           parsing = false;
       }
       else if ( position > chkSize ) // Oversized finish
       {
           mapIsProtected = true;
           parsing = false;
       }
       else // Natural finish (position == chkSize)
           parsing = false;

   } while ( parsing );

   // Pre-cache mergings/corrections
   correctMTXM();

   // Cache sections
   CacheSections();
   caching = true;

   return true;
}

bool Scenario::ParseSection(buffer &chk, u32 position, u32 &nextPosition)
{
   u32 sectionId = 0;
   s32 sectionSize = 0;

   if ( chk.get<u32>(sectionId, position) &&      // Get sectionId/title
        chk.get<s32>(sectionSize, position + 4) ) // Get section size
   {
       nextPosition = position + 8 + sectionSize;
   }
   else
       return false; // Unexpected read faliure

   if ( sectionSize >= 0 ) // Normal section
   {
       auto newSection = AddSection(sectionId);
       return nextPosition >= position + 8 && // Check for addition overflow
              (nextPosition > chk.size() || // Check for oversized
               sectionSize == 0 || // Check for empty section
               newSection->extract(chk, position+8, sectionSize)); // Move data to this section
   }
   else if ( sectionSize < 0 ) // Jump section
   {
       return nextPosition < position + 8 && // Check for addition underflow
              nextPosition != 0;             // Check for loop (right now it just checks for position to zero)
   }
   return true; // sectionSize == 0
}




TheNitesWhoSay - Clan Aura - github

Reached the top of StarCraft theory crafting 2:12 AM CST, August 2nd, 2014.

Jan 1 2017, 5:29 pm Wormer Post #3



jjf28 is right, since signed and unsigned is only a way how we interpret the number. If we're working with unsigned numbers then we consider overflow an error. If we say numbers are signed then we utilize overflow mechanics to make a subtraction operation out of summation and don't consider overflow an error.

In this particular case, since 32bit address space is assumed, we can individually address up to 2^32 bytes = 4GiB memory. If you're trying to shift forward more than there are bytes left from current position to the end of the address space overflow wraps it up and actually gets us back in address space.

That way, if our current (0-based) position is CP (which points at the byte just after the section header) and you shift SZ bytes forward, where SZ >= 4 GiB - CP, then next position NP is SZ - (4 GiB - CP) which is CP - NP = 4GiB - SZ bytes backward. The latter is in turn a number -SZ written in two's complement form.

jjf28, thank you for the nice piece of code! The check for addition underflow is smart, I probably wouldn't have thought about this little nuisance. Actually this question arouse in good time, because I was going to play with chk format on my own and write a parser. May I use the provided code as a start point?



Some.

Jan 1 2017, 5:45 pm jjf28 Post #4

Cartography Artisan

All of Chkdraft is under the MIT license so feel free to use it however, so long as you're not copy-pasting and claiming the code was your original work.

I wrote all of "Mapping Core" to be possible to quickly copy-paste into new projects (as I've done with lotsa my little apps like TrigCount) but you ofc can use the code however you wish ;)

The code was from this file in particular.



TheNitesWhoSay - Clan Aura - github

Reached the top of StarCraft theory crafting 2:12 AM CST, August 2nd, 2014.

Jan 1 2017, 5:55 pm Wormer Post #5



Thanks! That will be very useful to me! I just realized there might be weird loops due to backwards reference... uh oh. I wonder if jump sections are really used anywhere besides map protection.



Some.

Jan 1 2017, 7:19 pm jjf28 Post #6

Cartography Artisan

me and farty used jump sections for compressing things like dEUPs; otherwise I think it's just for protection



TheNitesWhoSay - Clan Aura - github

Reached the top of StarCraft theory crafting 2:12 AM CST, August 2nd, 2014.

Jan 3 2017, 2:37 am iCCup.xboi209 Post #7



I was actually going to write a Chk library :massimo:
I wanted to translate some Korean maps that are protected, but can't do so with conventional map editors.



None.

Jan 3 2017, 4:08 am trgk Post #8



1234 + 0xfffffffc = 1230



EUD

Options
  Back to forum
Please log in to reply to this topic or to report it.
Members in this topic: None.
[06:51 pm]
Vrael -- It is, and I could definitely use a company with a commitment to flexibility, quality, and customer satisfaction to provide effective solutions to dampness and humidity in my urban environment.
[06:50 pm]
NudeRaider -- Vrael
Vrael shouted: Idk, I was looking more for a dehumidifer company which maybe stands out as a beacon of relief amidst damp and unpredictable climates of bustling metropolises. Not sure Amazon qualifies
sounds like moisture control is often a pressing concern in your city
[06:50 pm]
Vrael -- Maybe here on the StarEdit Network I could look through the Forums for some Introductions to people who care about the Topics of Dehumidifiers and Carpet Cleaning?
[06:49 pm]
Vrael -- Perhaps even here I on the StarEdit Network I could look for some Introductions.
[06:48 pm]
Vrael -- On this Topic, I could definitely use some Introductions.
[06:48 pm]
Vrael -- Perhaps that utilizes cutting-edge technology and eco-friendly cleaning products?
[06:47 pm]
Vrael -- Do you know anyone with a deep understanding of the unique characteristics of your carpets, ensuring they receive the specialized care they deserve?
[06:45 pm]
NudeRaider -- Vrael
Vrael shouted: I've also recently becoming interested in Carpet Cleaning, but I'd like to find someone with a reputation for unparalleled quality and attention to detail.
beats me, but I'd make sure to pick the epitome of excellence and nothing less.
[06:41 pm]
Vrael -- It seems like I may need Introductions to multiple companies for the Topics that I care deeply about, even as early as Today, 6:03 am.
[06:38 pm]
Vrael -- I need a go-to solution and someone who understands that Carpets are more than just decorative elements in my home.
Please log in to shout.


Members Online: Moose