Cast unsigned long into signed short in PHP
In some other languages this problem is a matter of a simple cast. In PHP there's no such concept as all integers have the very same type (signed long long or signed long, architecture-dependent). Yet there are cases where you have to do that. E.g. unpack()
cannot read signed long
little endian byte order, only unsigned.
So, given an imaginary 32bit unsigned integer 4294967295
, how do I get a value for an imaginary signed 32bit integer from it? (That's -1
.)
For example, this can be done with pack
/unpack
, but this seems suboptimal to me.
Is there a better way?
How about 32bit versions of PHP? (They tend to solve this problem "automatically" with an integer overflow, but I rather not to use this architecture-dependent workarounds. Background.)
php
|
show 1 more comment
In some other languages this problem is a matter of a simple cast. In PHP there's no such concept as all integers have the very same type (signed long long or signed long, architecture-dependent). Yet there are cases where you have to do that. E.g. unpack()
cannot read signed long
little endian byte order, only unsigned.
So, given an imaginary 32bit unsigned integer 4294967295
, how do I get a value for an imaginary signed 32bit integer from it? (That's -1
.)
For example, this can be done with pack
/unpack
, but this seems suboptimal to me.
Is there a better way?
How about 32bit versions of PHP? (They tend to solve this problem "automatically" with an integer overflow, but I rather not to use this architecture-dependent workarounds. Background.)
php
1
"Getting a signed 16bit integer" from it doesn't make a whole lot of sense, since as you say, PHP doesn't have that kind of number. All you'd get is another 32/64bit integer with a different value. You want to interpret the byte representation of the 32bit signed int as 16bit int…?
– deceze♦
Nov 13 '18 at 0:58
'interpret the byte representation of the 32bit unsigned int as 16bit signed int' - that's about it (this issue)
– sanmai
Nov 13 '18 at 0:59
so just fix your code: github.com/pear/OLE/blob/… just use another formatunpack("v", fread($fh, 4));
php.net/manual/en/function.pack.php
– Alex
Nov 13 '18 at 1:19
@Alex do you propose to unpack into a signed value and hope for the best, e.g. for an overflow? What if it does not happen?
– sanmai
Nov 13 '18 at 1:33
I propose to have proper design and defined data flow. Your data is coming from some stream, and the only thing we should do - read stream data the way it was designed.
– Alex
Nov 13 '18 at 1:42
|
show 1 more comment
In some other languages this problem is a matter of a simple cast. In PHP there's no such concept as all integers have the very same type (signed long long or signed long, architecture-dependent). Yet there are cases where you have to do that. E.g. unpack()
cannot read signed long
little endian byte order, only unsigned.
So, given an imaginary 32bit unsigned integer 4294967295
, how do I get a value for an imaginary signed 32bit integer from it? (That's -1
.)
For example, this can be done with pack
/unpack
, but this seems suboptimal to me.
Is there a better way?
How about 32bit versions of PHP? (They tend to solve this problem "automatically" with an integer overflow, but I rather not to use this architecture-dependent workarounds. Background.)
php
In some other languages this problem is a matter of a simple cast. In PHP there's no such concept as all integers have the very same type (signed long long or signed long, architecture-dependent). Yet there are cases where you have to do that. E.g. unpack()
cannot read signed long
little endian byte order, only unsigned.
So, given an imaginary 32bit unsigned integer 4294967295
, how do I get a value for an imaginary signed 32bit integer from it? (That's -1
.)
For example, this can be done with pack
/unpack
, but this seems suboptimal to me.
Is there a better way?
How about 32bit versions of PHP? (They tend to solve this problem "automatically" with an integer overflow, but I rather not to use this architecture-dependent workarounds. Background.)
php
php
edited Nov 19 '18 at 5:36
sanmai
asked Nov 13 '18 at 0:55
sanmaisanmai
9,93674064
9,93674064
1
"Getting a signed 16bit integer" from it doesn't make a whole lot of sense, since as you say, PHP doesn't have that kind of number. All you'd get is another 32/64bit integer with a different value. You want to interpret the byte representation of the 32bit signed int as 16bit int…?
– deceze♦
Nov 13 '18 at 0:58
'interpret the byte representation of the 32bit unsigned int as 16bit signed int' - that's about it (this issue)
– sanmai
Nov 13 '18 at 0:59
so just fix your code: github.com/pear/OLE/blob/… just use another formatunpack("v", fread($fh, 4));
php.net/manual/en/function.pack.php
– Alex
Nov 13 '18 at 1:19
@Alex do you propose to unpack into a signed value and hope for the best, e.g. for an overflow? What if it does not happen?
– sanmai
Nov 13 '18 at 1:33
I propose to have proper design and defined data flow. Your data is coming from some stream, and the only thing we should do - read stream data the way it was designed.
– Alex
Nov 13 '18 at 1:42
|
show 1 more comment
1
"Getting a signed 16bit integer" from it doesn't make a whole lot of sense, since as you say, PHP doesn't have that kind of number. All you'd get is another 32/64bit integer with a different value. You want to interpret the byte representation of the 32bit signed int as 16bit int…?
– deceze♦
Nov 13 '18 at 0:58
'interpret the byte representation of the 32bit unsigned int as 16bit signed int' - that's about it (this issue)
– sanmai
Nov 13 '18 at 0:59
so just fix your code: github.com/pear/OLE/blob/… just use another formatunpack("v", fread($fh, 4));
php.net/manual/en/function.pack.php
– Alex
Nov 13 '18 at 1:19
@Alex do you propose to unpack into a signed value and hope for the best, e.g. for an overflow? What if it does not happen?
– sanmai
Nov 13 '18 at 1:33
I propose to have proper design and defined data flow. Your data is coming from some stream, and the only thing we should do - read stream data the way it was designed.
– Alex
Nov 13 '18 at 1:42
1
1
"Getting a signed 16bit integer" from it doesn't make a whole lot of sense, since as you say, PHP doesn't have that kind of number. All you'd get is another 32/64bit integer with a different value. You want to interpret the byte representation of the 32bit signed int as 16bit int…?
– deceze♦
Nov 13 '18 at 0:58
"Getting a signed 16bit integer" from it doesn't make a whole lot of sense, since as you say, PHP doesn't have that kind of number. All you'd get is another 32/64bit integer with a different value. You want to interpret the byte representation of the 32bit signed int as 16bit int…?
– deceze♦
Nov 13 '18 at 0:58
'interpret the byte representation of the 32bit unsigned int as 16bit signed int' - that's about it (this issue)
– sanmai
Nov 13 '18 at 0:59
'interpret the byte representation of the 32bit unsigned int as 16bit signed int' - that's about it (this issue)
– sanmai
Nov 13 '18 at 0:59
so just fix your code: github.com/pear/OLE/blob/… just use another format
unpack("v", fread($fh, 4));
php.net/manual/en/function.pack.php– Alex
Nov 13 '18 at 1:19
so just fix your code: github.com/pear/OLE/blob/… just use another format
unpack("v", fread($fh, 4));
php.net/manual/en/function.pack.php– Alex
Nov 13 '18 at 1:19
@Alex do you propose to unpack into a signed value and hope for the best, e.g. for an overflow? What if it does not happen?
– sanmai
Nov 13 '18 at 1:33
@Alex do you propose to unpack into a signed value and hope for the best, e.g. for an overflow? What if it does not happen?
– sanmai
Nov 13 '18 at 1:33
I propose to have proper design and defined data flow. Your data is coming from some stream, and the only thing we should do - read stream data the way it was designed.
– Alex
Nov 13 '18 at 1:42
I propose to have proper design and defined data flow. Your data is coming from some stream, and the only thing we should do - read stream data the way it was designed.
– Alex
Nov 13 '18 at 1:42
|
show 1 more comment
1 Answer
1
active
oldest
votes
For one, this can be done with pack
/unpack
:
$value = 4294967295;
$result = unpack("l", pack('L', $value));
var_dump($result[1]); // -1
Try live.
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%2f53272233%2fcast-unsigned-long-into-signed-short-in-php%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
For one, this can be done with pack
/unpack
:
$value = 4294967295;
$result = unpack("l", pack('L', $value));
var_dump($result[1]); // -1
Try live.
add a comment |
For one, this can be done with pack
/unpack
:
$value = 4294967295;
$result = unpack("l", pack('L', $value));
var_dump($result[1]); // -1
Try live.
add a comment |
For one, this can be done with pack
/unpack
:
$value = 4294967295;
$result = unpack("l", pack('L', $value));
var_dump($result[1]); // -1
Try live.
For one, this can be done with pack
/unpack
:
$value = 4294967295;
$result = unpack("l", pack('L', $value));
var_dump($result[1]); // -1
Try live.
answered Nov 19 '18 at 5:36
sanmaisanmai
9,93674064
9,93674064
add a comment |
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%2f53272233%2fcast-unsigned-long-into-signed-short-in-php%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
1
"Getting a signed 16bit integer" from it doesn't make a whole lot of sense, since as you say, PHP doesn't have that kind of number. All you'd get is another 32/64bit integer with a different value. You want to interpret the byte representation of the 32bit signed int as 16bit int…?
– deceze♦
Nov 13 '18 at 0:58
'interpret the byte representation of the 32bit unsigned int as 16bit signed int' - that's about it (this issue)
– sanmai
Nov 13 '18 at 0:59
so just fix your code: github.com/pear/OLE/blob/… just use another format
unpack("v", fread($fh, 4));
php.net/manual/en/function.pack.php– Alex
Nov 13 '18 at 1:19
@Alex do you propose to unpack into a signed value and hope for the best, e.g. for an overflow? What if it does not happen?
– sanmai
Nov 13 '18 at 1:33
I propose to have proper design and defined data flow. Your data is coming from some stream, and the only thing we should do - read stream data the way it was designed.
– Alex
Nov 13 '18 at 1:42