Jump to content
  • Advertisement
Sign in to follow this  
beebs1

STL Iterator Casting

This topic is 2632 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hiya,

If anyone could help with this it would be appreciated.

I have an STL vector of chars, and an iterator pointing at a certain position. I need to cast the 4 bytes which are 8 bytes ahead of the iterator into an int, so I can assign to it - but I'm not sure of the syntax.


/* If it was a regular array, I could do: */
unsigned char buffer[500];
int index = some_value;
*(unsigned int*)&buffer[index + 8] = value;

/* I'm not sure of the syntax when using STL & iterators. */
std::vector<unsigned char> buffer;
std::vector<unsigned char>::iterator itr = buffer.begin();
*(unsigned int*)(*itr + 8) = value; /* I believe this adds eight to the value of the char, but something similar? */


It's actually for a stream cipher - I'm not just being obtuse :)

Thanks very much for any suggestions.

Share this post


Link to post
Share on other sites
Advertisement
I think the result is undefined due to potential alignment issues.

Original C code breaks just about every guarantee C++ and STL try to make. If doing that, might as well stick with C.

Otherwise, the C++ code is something like this:
std::vector<unsigned char> buffer;
std::vector<unsigned char>::iterator itr = buffer.begin();
std::advance(itr, 8);

for (int i = 0; i < 4; i++) { // hard-coded to 4 (or 8), since cypher doesn't care about 32/64 bits
*itr = (unsigned char) (value & 0xff); // should probably use a proper cast
value /= 256; // depends on the type of 'value'
itr++;
}

Approximately. Untested.

Most of this is pointless, but there is a ton of gotchas.
- alignment requirements, on most non-x86 architectures writing to non-aligned address fails
- endianess - if just casting an int may result in different order (above is actually serialization problem)
- actually using iterators, instead of mangling pointers. Perhaps a non-issue in above case, but definitely not something iterators are for
If using raw pointers, memcpy would be *much* preferred to assigning to cast, but suffers from endianess issues.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!