Skip to content

Instantly share code, notes, and snippets.

@alexyakunin
Created July 31, 2019 22:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alexyakunin/103d9f7933da84b66ed196b04c5dc3ee to your computer and use it in GitHub Desktop.
Save alexyakunin/103d9f7933da84b66ed196b04c5dc3ee to your computer and use it in GitHub Desktop.
auto computeSum(char* fileName) {
auto fIn = open(fileName, O_RDONLY | O_BINARY, 0644);
static constexpr size_t BUFFER_SIZE = 1 << 16;
uint8_t buffer[BUFFER_SIZE];
uint8_t const* pBuffer = nullptr;
size_t bufferPos = 0;
size_t bufferLen = 0;
int64_t sum = 0;
uint8_t b;
int n = 0;
while (bufferLen = read(fIn, buffer, BUFFER_SIZE)) {
pBuffer = buffer;
const uint8_t* const pBufferEnd = buffer + bufferLen;
while (pBuffer != pBufferEnd) {
if (*pBuffer < 128) {
n = (n << 7) + *pBuffer;
} else {
n = (n << 7) + *pBuffer - 128;
sum += n;
n = 0;
}
++pBuffer;
}
}
close(fIn);
return sum;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment