How to apply the two add-on to an Hex string in c#?

Asked

Viewed 685 times

1

I need help converting an Hex string into an Hex string by applying two add-on.

Example: 0x00FEB5AB 0x00014A55

My Hex. 00FF17DB ? (represents a negative latitude)

and 00FCFF75 ? (represents a negative longitude)

Thank you all.

1 answer

4


A simple way may be to calculate the complement to 1 and add 1 as described in the entry Complement to two wikipedia.

I say it’s a simple way because it’s easy to calculate the complement of 1, just for this to apply the operation bitwise NOT at value:

const string valor = "00FEB5AB";
//Converte para inteiro
uint valorInteiro = Convert.ToUInt32(valor, 16);
//Aplica o bitwise NOT e soma 1
uint complemento = ~valorInteiro + 1;
//Converte para string no formato hexadecimal
string complementoHex = string.Format("{0:X}", complemento);

Note that the calculated value is "FF014A55" and not "00014A55" as you say, because the result is calculated considering the amplitude (number of bytes) of the input.

By what I was given to realize the calculators existing on the net only consider the bytes significant, making the calculation truncating the non-significant bytes (00’s left).

Using the above code, the following method allows the calculation of the two forms:

public string ComputeTwosComplement(string hexValue, bool areAllBytesSignificant)
{
    const int maxNumberOfBytes = 8;
    int lenght = hexValue.Length;

    //Não permite mais de 64bits
    if (lenght > maxNumberOfBytes*2) throw new ArgumentOutOfRangeException(hexValue);

    //Converte hexadecimal para long
    ulong intValue = Convert.ToUInt64(hexValue, 16);

    //Calcula o complemento para 2
    ulong complement = (~intValue + 1);

    //Converte para hexadecimal
    string twosComplement = string.Format("{0:X16}", complement);

    if (areAllBytesSignificant)
    {
        //Ajusta para o mesmo número de bytes do valor passado
        twosComplement = twosComplement.Substring(maxNumberOfBytes*2 - lenght);
    }
    else
    {
        //Representação hexadecimal do valor passado sem 00's à esquerda
        string significantBytes = string.Format("{0:X}", intValue);
        //Ajusta para o número de bytes significativos do valor passado
        twosComplement = twosComplement.Substring(maxNumberOfBytes*2 - significantBytes.Length);
    }
    return twosComplement;
}

To maintain amplitude and get "FF014A55" use:

ComputeTwosComplement("00FEB5AB", true);

To adjust the amplitude and get "014A55" use:

ComputeTwosComplement("00FEB5AB", false);

Note that if the value passed does not have 00’s on the left ("FEB5AB") it is indifferent to pass true or false, the result is always "014A55".

  • I used this code. string hexPosition = "00FF17DB";
uint intHexPosition = Convert.ToUInt32(hexPosition, 16);
uint twosComp = ~intHexPosition + 1;
hexPosition = string.Format("{0:X}", twosComp); But me returns FF00E825 the correct would be E825 pq?

  • I had already pointed this out in the answer. I think it may have something to do with the fact that 32 bits are being used in the calculation. I’ll edit the answer.

  • I used an online converter and hit just right but I passed the values in Hex then converted into bin soon after applied the 2 add-on and then converted back to Hex. 00FF17DB -> 111111110001011111011011 -> 2C -> 000000001110100000100101 - > E825.

  • Please confirm that for 0x00FEB5AB is 0x00014A55 or is 0x00004A55

  • Correct for Hex value "00FF17DB". However the Hex value "00FCFF75" returns incorrect (0000008B). The expected value for "00FCFF75" would be FF03008B.

  • 00FEB5AB = 00004A55

  • If for the value "00FCFF75" is "FF03008B" then the initial version is right. I don’t understand why sometimes it works.

  • I will revert to the initial version.

  • Sorry the value for "00FCFF75" = 3008B but returns 0000008B. The value "00FF17DB" is correct E825. Also did not understand why work for "00FF17DB" and not work for "00FCFF75". =/

  • 0x0F7EF73D 0x008108C3 (Correct) Applying the second example returns 000008C3 (?) Manual of the protocol page 73 says 32bits. https://drive.google.com/file/d/0B82vmwUnG1x8bXZrbUw3ZTZnTjA/view?usp=sharing

  • @ramaral problem is only depending on the number of bytes used. If you used 3 bytes in the 1st value, it would work. I think the question is problematic in this sense, it is necessary to know the right length of the value before applying the complement AA -> 56, 00AA -> FF56, etc. - To complement, specify the size is fundamental.

  • @Bacchus If I understood your comment the result will have to be truncated to have the same length of input not considering the pairs of zeros on the left (number of significant bytes): input = 00AA => -AA, length = 2, result 56. This clear to go against what the AP asks.

  • I thought about truncating but I was afraid. I will do some tests with other data. This link returns perfectly. (http://www.hobbyprojects.com/calculators/binary_decimal_hex_converter.html)

  • Perfect! I am very grateful.

Show 9 more comments

Browser other questions tagged

You are not signed in. Login or sign up in order to post.