Find and increment value in string of hex


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Find and increment value in string of hex
# 8  
Old 12-19-2017
Sorry typo...should have said
Code:
0x7F

(corrected it now)

So all values greater than this, starting with
Code:
0x80

will be represented as 4 digits and the length set to 02, i.e.
Code:
84020080a7

# 9  
Old 12-19-2017
Try
Code:
awk '
        {while (match ($0, /84[^a]*a7/))        {printf "%s", substr ($0, 1, RSTART + 1)
                                                 if (TMP == "") TMP = sprintf ("%.f", "0x" substr ($0, RSTART + 4 , RLENGTH - 6))
                                                   else         TMP++
                                                 LG = (TMP > 127) + 1
                                                 printf "%02x%0*x", LG, 2*LG, TMP
                                                 $0 = substr ($0, RSTART + RLENGTH - 2)
                                                }
         print $0
        }
' file

Be aware that with lines longer than the system config parameter LINE_MAX (my system: 2048) the result may not be what you expect.
# 10  
Old 12-19-2017
Hi securegooner,
If you increment 7F to 80 and on subsequent runs to 81, 82, 83, and 84; you then have an ambiguity as to where the string starting with 84 starts. Should the string 84017Fa7 be incremented to 84020080a7 or to 84020100a7??? And, can there only be values 01 and 02 after the leading 84? Or, should 8402FFFFa7 or 84027F7Fa7 be incremented to 8403010000a7?

And will you really have an uppercase 7F and a lowercase a7?

Please be very sure that your specification is clear and complete and accurately specifies what you are trying to do.

Hi RudiC,
Note also that using match($0,/84[^a]*a7/) may get a false match on even byte boundaries such as 0840a7 and RSTART and RLENGTH won't be set correctly for a cases like 08012aa7 and 08020a0aa7.

To get proper alignment, we have to be sure tha characters are matched in pairs starting on odd character boundaries.
This User Gave Thanks to Don Cragun For This Post:
# 11  
Old 12-19-2017
Thanks Don, valuable caveats indeed, although I regarded my attempt more a proof of concept than a bullet proof program.
Eliminating false matches can be done by in the regex exactly counting the characters between 84 and a7, which could be 4 or 6 according to the spec in post#1. And, finding even boundaries equiv. to full bytes can be done by evaluating the evenness or oddness of RSTART. See below:
Code:
awk '
        {print
         while (match ($0, /84....(..)?a7/))    {printf "%s", substr ($0, 1, RSTART + 1)
                                                 if (RSTART%2)  {if (!TMP)      TMP = sprintf ("%.f", "0x" substr ($0, RSTART + 4 , RLENGTH - 6))
                                                                    else        TMP++
                                                                 LG  = (TMP > 127) + 1
                                                                 printf "%02x%0*x", LG, 2*LG, TMP
                                                                }
                                                        else    {RLENGTH--
                                                                 printf "%s", substr ($0, RSTART + 2, RLENGTH - 4)
                                                                }
                                                 $0 = substr ($0, RSTART + RLENGTH - 2)
                                                }
         print
        }
' file

I appreciate there's still some pitfalls that are not yet covered, but I think that's how far we get with a spec as given.
# 12  
Old 12-20-2017
Thanks very much for your comments and suggestions RudiC and Don.

I will try the posted code on my data to see if it produces the output I wanted to achieve and get back to you...
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Find and increment at each occurence of string (loop)

I created script (sh shell) to generate vlc playlist based on some data files. All works fine so far except one string I do not know how to handle with. VLCSTART='<vlc:id>' VLCV=0 VLCEND='</vlc:id>' echo -e $'\n'$'\t'$'\t'$'\t'$'\t'\$VLCSTART$VLCV$VLCENDOutput file contains several occurences... (10 Replies)
Discussion started by: TiedCone
10 Replies

2. Shell Programming and Scripting

String increment in UNIX

Hi, I am able to increment numbers but unable to increment the charters in unix -AIX. Source : AAA BB CCC Increment Number : 5 OUTPUT: AAA BB CCC AAA BB CCD AAA BB CCE AAA BB CCF AAA BB CCG Thanks onesuri Please use CODE tags as required by the forum rules. I have made a wild... (5 Replies)
Discussion started by: onesuri
5 Replies

3. Shell Programming and Scripting

String to HEX conversion in UNIX

i have this below string which i need to convert it to HEX. i have already tried it but it showing extra few things on it.. let me show what i have done and what is the output i am getting and what is the desired output the input string is "!\"\"\"\"\"\"\"!\"\"\"\"\"\"\"" which is... (4 Replies)
Discussion started by: vivek d r
4 Replies

4. Shell Programming and Scripting

How to increment a string variable?

Hi All, I am new to this forum and a novice at shell script. I am trying to write a script to determine each of the NIC configured on a linux system and its speed and Duplex. I came up with the following piece of code: echo `ifconfig -a | grep eth > /home/a/nic.txt` i=`awk -F, '{print... (4 Replies)
Discussion started by: pravin883
4 Replies

5. Shell Programming and Scripting

How to cut the particular string and increment the rows?

Hi am using unix aix I have tried using awk but am getting only output = x ,its not incrementing next output set -A var1 vv qa za ct=0 i=3 while do var1=`echo ${var1}` count=`awk ' NR==$i++ {print;exit}' ${.txt} | cut -c5 ` echo $count let ct=ct+1 done (6 Replies)
Discussion started by: Venkatesh1
6 Replies

6. Programming

Hex string conversion?

Hello all. I need help... How can I cenvert this 42ec93df826c804ea531c56594db453d54daad4b to normal text? What convertor I have to use? Thanks. (12 Replies)
Discussion started by: escudo
12 Replies

7. UNIX for Dummies Questions & Answers

increment numbers in several parts of a string

I know how to do produce this: string01 string02 string03 several different ways. But how do I do produce this (without getting lost in recursion): string01morestring100yetmore10 string02morestring101yetmore20 string03morestring102yetmore30 ...... (2 Replies)
Discussion started by: uiop44
2 Replies

8. Shell Programming and Scripting

Match hex value in string (Perl)

I am trying to match a character return from a website so that I can replace it. It is the '...' character (didnt even know it existed initially). The character apparently has the hex value of 2026, but in the script, attempting to substitute regular 3 periods is not working. What am I... (2 Replies)
Discussion started by: Guyverix
2 Replies

9. Shell Programming and Scripting

increment a value at an offset in hundreds very large hex file

I have a lot of very large hex files that I need to change one value at the same offset and save to another file. I have a script that finds each file and just need to put an operator for each file. I think sed might be able to do this but I have not used it before and would like some help. If... (8 Replies)
Discussion started by: Eruditass
8 Replies

10. Programming

converting character string to hex string

HI Hi I have a character string which contains some special characters and I need it to display as a hex string. For example, the sample i/p string: ×¥ïA Å gïÛý and the o/p should be : D7A5EF4100C5010067EFDBFD Any pointers or sample code pls. (5 Replies)
Discussion started by: axes
5 Replies
Login or Register to Ask a Question