BinaryReader vs byte[]+shifts
I must be misunderstanding what BinaryReader
is doing. Why are these outputs different?
var data = File.ReadAllBytes(testFile);
var pos = 0;
var read8 = new Func<uint>(() => data[pos++]);
var read32 = new Func<uint>(() => (read8() << 24)
using (var reader = new BinaryReader(File.Open(testFile, FileMode.Open)))
Console.WriteLine(reader.ReadUInt32());
c# binaryreader
add a comment |
I must be misunderstanding what BinaryReader
is doing. Why are these outputs different?
var data = File.ReadAllBytes(testFile);
var pos = 0;
var read8 = new Func<uint>(() => data[pos++]);
var read32 = new Func<uint>(() => (read8() << 24)
using (var reader = new BinaryReader(File.Open(testFile, FileMode.Open)))
Console.WriteLine(reader.ReadUInt32());
c# binaryreader
add a comment |
I must be misunderstanding what BinaryReader
is doing. Why are these outputs different?
var data = File.ReadAllBytes(testFile);
var pos = 0;
var read8 = new Func<uint>(() => data[pos++]);
var read32 = new Func<uint>(() => (read8() << 24)
using (var reader = new BinaryReader(File.Open(testFile, FileMode.Open)))
Console.WriteLine(reader.ReadUInt32());
c# binaryreader
I must be misunderstanding what BinaryReader
is doing. Why are these outputs different?
var data = File.ReadAllBytes(testFile);
var pos = 0;
var read8 = new Func<uint>(() => data[pos++]);
var read32 = new Func<uint>(() => (read8() << 24)
using (var reader = new BinaryReader(File.Open(testFile, FileMode.Open)))
Console.WriteLine(reader.ReadUInt32());
c# binaryreader
c# binaryreader
edited Nov 15 '18 at 18:58
GSerg
60.1k15106231
60.1k15106231
asked Nov 15 '18 at 18:56
Brandon PrudentBrandon Prudent
1057
1057
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
Endiannes.
Use:
var read32 = new Func<uint>(() => (read8() | (read8() << 8) | (read8() << 16) | read8() << 24));
On a side note, please don't write code with such side effects.
You are getting away with them here because the order of evaluation is guaranteed, but still please don't.
Right, of course. Thank you. On the side note I'm not sure I'm trackin' - is the order of evaluation not always (parens), functions(), and then operators? What is the side effect?
– Brandon Prudent
Nov 15 '18 at 20:09
The side effect is the++
inside theread8
. That same code would look completely safe if it was a series of statements terminated by a semicolon, but a single expression where each member has a side effect that affects calculation of other members of the same expression is something you want to avoid - even though it does not lead to undefined behaviour like in C++ (see the link), it may still be very confusing.
– GSerg
Nov 15 '18 at 20:58
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53326198%2fbinaryreader-vs-byteshifts%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Endiannes.
Use:
var read32 = new Func<uint>(() => (read8() | (read8() << 8) | (read8() << 16) | read8() << 24));
On a side note, please don't write code with such side effects.
You are getting away with them here because the order of evaluation is guaranteed, but still please don't.
Right, of course. Thank you. On the side note I'm not sure I'm trackin' - is the order of evaluation not always (parens), functions(), and then operators? What is the side effect?
– Brandon Prudent
Nov 15 '18 at 20:09
The side effect is the++
inside theread8
. That same code would look completely safe if it was a series of statements terminated by a semicolon, but a single expression where each member has a side effect that affects calculation of other members of the same expression is something you want to avoid - even though it does not lead to undefined behaviour like in C++ (see the link), it may still be very confusing.
– GSerg
Nov 15 '18 at 20:58
add a comment |
Endiannes.
Use:
var read32 = new Func<uint>(() => (read8() | (read8() << 8) | (read8() << 16) | read8() << 24));
On a side note, please don't write code with such side effects.
You are getting away with them here because the order of evaluation is guaranteed, but still please don't.
Right, of course. Thank you. On the side note I'm not sure I'm trackin' - is the order of evaluation not always (parens), functions(), and then operators? What is the side effect?
– Brandon Prudent
Nov 15 '18 at 20:09
The side effect is the++
inside theread8
. That same code would look completely safe if it was a series of statements terminated by a semicolon, but a single expression where each member has a side effect that affects calculation of other members of the same expression is something you want to avoid - even though it does not lead to undefined behaviour like in C++ (see the link), it may still be very confusing.
– GSerg
Nov 15 '18 at 20:58
add a comment |
Endiannes.
Use:
var read32 = new Func<uint>(() => (read8() | (read8() << 8) | (read8() << 16) | read8() << 24));
On a side note, please don't write code with such side effects.
You are getting away with them here because the order of evaluation is guaranteed, but still please don't.
Endiannes.
Use:
var read32 = new Func<uint>(() => (read8() | (read8() << 8) | (read8() << 16) | read8() << 24));
On a side note, please don't write code with such side effects.
You are getting away with them here because the order of evaluation is guaranteed, but still please don't.
answered Nov 15 '18 at 19:03
GSergGSerg
60.1k15106231
60.1k15106231
Right, of course. Thank you. On the side note I'm not sure I'm trackin' - is the order of evaluation not always (parens), functions(), and then operators? What is the side effect?
– Brandon Prudent
Nov 15 '18 at 20:09
The side effect is the++
inside theread8
. That same code would look completely safe if it was a series of statements terminated by a semicolon, but a single expression where each member has a side effect that affects calculation of other members of the same expression is something you want to avoid - even though it does not lead to undefined behaviour like in C++ (see the link), it may still be very confusing.
– GSerg
Nov 15 '18 at 20:58
add a comment |
Right, of course. Thank you. On the side note I'm not sure I'm trackin' - is the order of evaluation not always (parens), functions(), and then operators? What is the side effect?
– Brandon Prudent
Nov 15 '18 at 20:09
The side effect is the++
inside theread8
. That same code would look completely safe if it was a series of statements terminated by a semicolon, but a single expression where each member has a side effect that affects calculation of other members of the same expression is something you want to avoid - even though it does not lead to undefined behaviour like in C++ (see the link), it may still be very confusing.
– GSerg
Nov 15 '18 at 20:58
Right, of course. Thank you. On the side note I'm not sure I'm trackin' - is the order of evaluation not always (parens), functions(), and then operators? What is the side effect?
– Brandon Prudent
Nov 15 '18 at 20:09
Right, of course. Thank you. On the side note I'm not sure I'm trackin' - is the order of evaluation not always (parens), functions(), and then operators? What is the side effect?
– Brandon Prudent
Nov 15 '18 at 20:09
The side effect is the
++
inside the read8
. That same code would look completely safe if it was a series of statements terminated by a semicolon, but a single expression where each member has a side effect that affects calculation of other members of the same expression is something you want to avoid - even though it does not lead to undefined behaviour like in C++ (see the link), it may still be very confusing.– GSerg
Nov 15 '18 at 20:58
The side effect is the
++
inside the read8
. That same code would look completely safe if it was a series of statements terminated by a semicolon, but a single expression where each member has a side effect that affects calculation of other members of the same expression is something you want to avoid - even though it does not lead to undefined behaviour like in C++ (see the link), it may still be very confusing.– GSerg
Nov 15 '18 at 20:58
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53326198%2fbinaryreader-vs-byteshifts%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown