Cast unsigned long into signed short in PHP










0















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.)










share|improve this question



















  • 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















0















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.)










share|improve this question



















  • 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













0












0








0








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.)










share|improve this question
















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






share|improve this question















share|improve this question













share|improve this question




share|improve this question








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 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












  • 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







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












1 Answer
1






active

oldest

votes


















0














For one, this can be done with pack/unpack:



$value = 4294967295;
$result = unpack("l", pack('L', $value));
var_dump($result[1]); // -1


Try live.






share|improve this answer






















    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
    );



    );













    draft saved

    draft discarded


















    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









    0














    For one, this can be done with pack/unpack:



    $value = 4294967295;
    $result = unpack("l", pack('L', $value));
    var_dump($result[1]); // -1


    Try live.






    share|improve this answer



























      0














      For one, this can be done with pack/unpack:



      $value = 4294967295;
      $result = unpack("l", pack('L', $value));
      var_dump($result[1]); // -1


      Try live.






      share|improve this answer

























        0












        0








        0







        For one, this can be done with pack/unpack:



        $value = 4294967295;
        $result = unpack("l", pack('L', $value));
        var_dump($result[1]); // -1


        Try live.






        share|improve this answer













        For one, this can be done with pack/unpack:



        $value = 4294967295;
        $result = unpack("l", pack('L', $value));
        var_dump($result[1]); // -1


        Try live.







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 19 '18 at 5:36









        sanmaisanmai

        9,93674064




        9,93674064



























            draft saved

            draft discarded
















































            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.




            draft saved


            draft discarded














            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





















































            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







            Popular posts from this blog

            Use pre created SQLite database for Android project in kotlin

            Darth Vader #20

            Ondo