Hi Richard, That was just an example, to show that, for that particular string of binary numbers, the code works as expected. That is absolutely no related to the dataset I provided. If I try the function on the dataset, I get values well over the latitude and longitude boundaries (which should range from -90 to + 90, and -180 to +180).
Regards, Paul El vie., 24 ene. 2020 a las 12:23, Richard M. Heiberger (<r...@temple.edu>) escribió: > You show the example > > > fun("10110010") > [1] -78 > > as satisfactory. Where in your posted data set do you find the input > string "10110010"? > > Please post a set of relevant input strings, and the answers you want from > them. > The rest of the columns are not helpful for this specific exercise. > > On Fri, Jan 24, 2020 at 11:34 AM Paul Bernal <paulberna...@gmail.com> > wrote: > > > > Dear friend Rui, > > > > Hope you are doing great. Firstly, I want to thank you for your super > > valuable and kind support of always. As I mentioned in earlier e-mails, I > > am trying to decode AIS type messages, and the only ones I am having a > real > > hard time with, is with latitude and longitude. > > > > I tried the function you provided me in one of your replies, and it works > > well with the examples you provided, but in other cases it doesn´t. > > > > The messages I am trying to decode are in the 6th column of the data. I > > will provide you with a small sample first, and then the complete dataset > > (which has 100 rows). This is the small sample: > > > > > head(dat) > > ...1 ...2 ...3 ...4 ...5 ...6 ...7 ...8 > > ...9 ...10 ...11 ...12 ...13 > > 1 !AIVDM 1 1 NA A 15?f5H?P00rCQat5:Oah0?wn2@S6 0*54 > 1485907200 > > <NA> NA NA NA <NA> > > 2 !AIVDM 1 1 NA A 1349B:3000rCtrn553aR@JH02PRp 0*39 > 1485907200 > > <NA> NA NA NA <NA> > > 3 !AIVDM 1 1 NA A D03Iuph1TNfp4dv9J<`N000 2*0D 1485907200 > > <NA> NA NA NA <NA> > > 4 !AIVDM 1 1 NA A D03Iu6QGLN01MdN01StN000 2*43 1485907200 > > <NA> NA NA NA <NA> > > 5 !AIVDO 1 1 NA <NA> B;s@N9h00>TtPEQAslh03wuUwP06 0*29 > 1485907200 > > <NA> NA NA NA <NA> > > 6 !AIVDM 1 1 NA A 15A@av3P00rClHn53<I8M?v02<2B 0*2D > 1485907200 > > <NA> NA NA NA <NA> > > > > It is worth mentioning that each row of the 6th column provides several > > information about maritime vessels, like speed over ground, latitude, > > longitude, vessel ID, etc. I am only concerned with latitude and > longitude > > since those are the only two fields I have not been able to decode > > successfully. Also, I am working on R version 3.6.2 for windows 64-bit > OS. > > > > The messages to decode are of the following format: > > 15?f5H?P00rCQat5:Oah0?wn2@S6, 1349B:3000rCtrn553aR@JH02PRp, etc. > > > > Now, here is the complete dataset: > > > > > dput(dat) > > structure(list(...1 = c("!AIVDM", "!AIVDM", "!AIVDM", "!AIVDM", > > "!AIVDO", "!AIVDM", "!AIVDM", "!AIVDM", "!AIVDM", "!AIVDM", "!AIVDM", > > "!AIVDM", "!AIVDM", "!AIVDM", "!AIVDM", "!AIVDO", "!AIVDM", "!AIVDM", > > "!AIVDM", "!AIVDM", "!AIVDM", "!AIVDM", "!AIVDM", "!AIVDM", "!AIVDM", > > "!AIVDO", "!AIVDM", "$GPRMC", "!AIVDM", "!AIVDM", "!AIVDM", "$GPGBS", > > "!AIVDM", "!AIVDM", "!AIVDM", "!AIVDO", "!AIVDM", "!AIVDM", "!AIVDM", > > "!AIVDM", "!AIVDM", "!AIVDM", "!AIVDM", "!AIVDO", "!AIVDM", "!AIVDM", > > "!AIVDM", "!AIVDM", "!AIVDM", "!AIVDM", "!AIVDM", "!AIVDO", "!AIVDM", > > "!AIVDM", "!AIVDM", "!AIVDM", "!AIVDM", "!AIVDM", "!AIVDM", "!AIVDM", > > "!AIVDM", "!AIVDO", "$GPRMC", "!AIVDM", "!AIVDM", "!AIVDM", "!AIVDM", > > "!AIVDM", "$GPGBS", "!AIVDM", "!AIVDM", "!AIVDM", "!AIVDO", "!AIVDM", > > "!AIVDM", "!AIVDM", "!AIVDM", "!AIVDM", "!AIVDO", "!AIVDM", "!AIVDM", > > "!AIVDM", "!AIVDM", "!AIVDM", "!AIVDM", "!AIVDM", "!AIVDO", "!AIVDM", > > "!AIVDM", "!AIVDM", "!AIVDM", "!AIVDM", "!AIVDM", "!AIVDM", "!AIVDM", > > "!AIVDM", "$GPRMC", "!AIVDO", "!AIVDM", "!AIVDM"), ...2 = c(1, > > 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, > > 1, 1, 1, 1, 1, 50002, 1, 2, 2, 50002, 1, 1, 1, 1, 1, 1, 1, 1, > > 1, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, > > 1, 50006, 1, 1, 1, 1, 1, 50006, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, > > 1, 1, 1, 1, 2, 2, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 50010, 1, > > 1, 1), ...3 = c("1", "1", "1", "1", "1", "1", "1", "1", "1", > > "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", > > "1", "1", "1", "1", "1", "A", "1", "1", "2", "1.3", "1", "1", > > "1", "1", "1", "1", "1", "1", "1", "1", "2", "1", "1", "1", "1", > > "1", "1", "1", "2", "1", "1", "1", "1", "1", "1", "1", "1", "1", > > "2", "1", "A", "1", "1", "1", "1", "1", "1.3999999999999999", > > "1", "2", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", > > "1", "1", "2", "1", "1", "1", "1", "2", "1", "1", "1", "1", "1", > > "1", "A", "1", "1", "1"), ...4 = c(NA, NA, NA, NA, NA, NA, NA, > > NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, > > NA, NA, NA, NA, 856.96783, NA, 7, 7, 1.5, NA, NA, NA, NA, NA, > > NA, NA, NA, NA, 8, 8, NA, NA, NA, NA, NA, NA, 9, 9, NA, NA, NA, > > NA, NA, NA, NA, NA, 0, 0, NA, 856.96805, NA, NA, NA, NA, NA, > > 1.5, 1, 1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 2, > > 2, NA, NA, NA, 3, 3, NA, NA, NA, NA, NA, NA, 856.96827, NA, NA, > > NA), ...5 = c("A", "A", "A", "A", NA, "A", "A", "B", "B", "A", > > "A", "A", "A", "B", "B", NA, "B", "A", "B", "A", "B", "B", "A", > > "B", "A", NA, "B", "N", "B", "A", "A", "3.2000000000000002", > > "B", "A", "A", NA, "A", "A", "A", "A", "B", "A", "A", NA, "B", > > "A", "A", "A", "A", "A", "A", NA, "A", "A", "A", "B", "B", "B", > > "B", "A", "A", NA, "N", "A", "A", "B", "B", "B", "3.2999999999999998", > > "B", "B", "B", NA, "B", "B", "A", "B", "B", NA, "B", "B", "A", > > "A", "B", "B", "A", NA, "B", "B", "B", "A", "A", "A", "A", "A", > > "B", "N", NA, "B", "B"), ...6 = c("15?f5H?P00rCQat5:Oah0?wn2@S6", > > "1349B:3000rCtrn553aR@JH02PRp", "D03Iuph1TNfp4dv9J<`N000", > > "D03Iu6QGLN01MdN01StN000", > > "B;s@N9h00>TtPEQAslh03wuUwP06", "15A@av3P00rClHn53<I8M?v02<2B", > > "1000Fo@P01rCuG<56bnkN?v004`0", "15QK900001JCq=d54l?5J0op0l4e", > > "15@eD@8000rC`bl59kW`mFn004`0", "15QIK`0P00rC`Sb59jFUUgv02<1g", > > "403Iupiv4PU00rC9065>=fW00H0I", "403Iu6Qv4PU00rCk0d57rwW00<2g", > > "H5?AU:4U653hhhi8@lkihP000000", "15TGcJ0002rD<>p55FgmI@Ul0H0S", > > "15Aq00?P00rC`a`59mFeogv004`0", "B;s@N9h00>TtPF1Asll03wP5wP06", > > "13P;K8@Oh1rCfgp58=ec1bD22<4J", "139NL4000LrCc8j59FEED4@000S<", > > "403Iupiv4PU00rC9065>=fW00H0j", "39NS@m11@1rCrb:53:E<v0j3R000", > > "403Iu6Qv4PU01rCk0d57rwW00<2g", "15PvE@0002rCi7R57pokCT:424`0", > > "15TgVb0000rCgVd57oFc31R42L46", "15PoOh0001rCgbt58CwUaBD004`0", > > "A03IupkAC4:dH0v90>@P1cF6nud@NrP5wH5T", "B;s@N9h00>TtPF1Asll03wPUwP06", > > "15E=q08P00JCrnR52cb>4?v200Sw", "7933.8836099999999", > > "15>uP00P00rC`U:59im;H?v22@1D", > > "54aMBf02:9M`?IDOH018DL4j085T000000000016>`Q8>4Oc0?@lRDm3hPC0", > > "3", NA, "1018lEWP?w<tSF0l4Q@>4?wp0W3h", "15BkV00P00rCQBf5:Q5JQOv42D1o", > > "35QN<D1000rCr5l53esbgPR20000", "B;s@N9h00>TtPF1Aslp03wQ5wP06", > > "34`odN1000rD1V2537=dfPJ60000", "15>nNj0000rCT<@5::qUpkt604`0", > > "15UHOn9P00rCQ`D5:OcTkgv80<4:", "35A=Rh1001rD;s454vSTuP`40000", > > "15U?B00000rCgb>58DFJfRl620RT", > "55B7iD42CSGC<H`WF20L5>1=@5:222222222221@G > > @W9K4Oi0D@PC0ShK40C", > > "PC@H8888880", "B;s@N9h00>TtPFQAslt03wQUwP06", > > "15De7F?P00JCr5r5517v4?v80h2P", > > "15U@cn0000rCgU>57oPLGiT:2D4D", "137g`F8007rCaIj59Tc5Dl@800SN", > > "15?7P`0P00rD1S453KSlj?v824`0", "15?mqH?P00rCek458rkEN?v:00S4", > > "55R4:002?H<`Q3S7GR1<lUB0@4pF22222222220l000004p60;0E7kBE8888", > > "88888888880", "B;s@N9h00>TtPFQAslt03wR5wP06", > > "15E:BR0P00rCgaT58DdJUwv82H34", > > "15AIw`0P0GrCcO859DO5Ogv:0T`0", "14aMBf000wrCKKN5:sdU0Sv<083C", > > "1819?@H001rC9TB5=bppM9<82D0T", "13M@Hk00jSJD@RD4s=qG1mT80@3J", > > "15BI>P0001rCgUD58DRalRj:00S5", "100000?P00JCkt:583J=r?v:283Q", > > "A03IupkAC4:dH0N90C9p0goOwj<Cw`P05A7vnh081wqU05DFwAKw<0?va@1>", > > "1gu00CLLwfh2@Asw9@1<", "B;s@N9h00>TtPFQAsm003wRUwP06", > > "7933.8835099999997", > > "18K1kH000FrCSMt5:@;m>l8>0<4J", "19NSFKh000JCTeH5:7g1LT8:0`3g", > > "15E=m60000rC`W459k28Wnd:083h", "1:u0KOh001rCq5P529qqubqh2@3n", > > "13P>4mhw1CrCi5H57aK5WlN>0<4F", NA, > > "A03IupkAC4:dH0N90D=p0goP02<Cw``05A7vnwt81wqVwUDFwAOt<0?vah1>", > > "1gu103LLwfl1@Asw9P1<", "14S8@n001LrD?bH53iGe1rN>0@49", > > "B;s@N9h00>TtPG1Asm403wSUwP06", > > > > "15E:N@0000rCgOd57p45bW><0<2H", "15@EA<0P01JCo8l53=BFgwv@0D47", > > "10007NgP00rCQGV5:Pa=?gv>2<1H", "15TILd?P00JCm4l53`D>4?v>0L1m", > > "19NSG<h003rCi@:57pmUkAB<0<1v", "B;s@N9h00>TtPG1Asm403wT5wP06", > > "15Q69@8000rCiDr57n`bp@tB2<4R", "15QtF00000rCafD59P?VJ9p<0H52", > > "15QCl@?P?w<tSF0l4Q@>4?wp0@5:", "15QDCP0P?w<tSF0l4Q@>4?wp0D1G", > > "803Iu6PF15REPH3@Dh000000000002c88I2P0002IrbQ0@40TW`800000000", > > "HGp0772K07N4d1;0Pf71r0aj19RVmR19RVuR19RW5R19RW;t91Cjp31000C4", > > "15D8Gj0P00rCThP5:6T=2Ov>0@5H", "B;s@N9h00>TtPG1Asm803wTUwP06", > > "15ATk20000rCnrv53N6;gPr>085R", > > "55AP::02@VAlQ3G;7:1<lUB0MD4@DhuE0F22220l0`G465k90<PlRDm3hPC8", > > > > "88888888880", "15?lSL?P00JCQWD5:OpP0?vB24`0", > > "15BW=20P00JCrvH54t=an?vB00Sg", > > "13P;K8@001rCfgr58=f;QbFD2D4G", "A03IupkAC4:dH0v90FtP1cF6nud@NrP5wH5T", > > "85E:BR0F0P0000000000032jS2P000000DE7P3A00h0", > "1349B:3000rCtrn553aR@JHD2d4O", > > > > "7933.8835099999997", "B;s@N9h00>TtPFQAsm803wU5wP06", > > "15B3Sj0000rC9RD5=mOh40jB20SU", > > "15TgVb0000rCgVb57oFc;ARF2@67"), ...7 = c("0*54", "0*39", "2*0D", > > "2*43", "0*29", "0*2D", "0*27", "0*1D", "0*26", "0*48", "0*4B", > > "0*3A", "0*34", "0*3A", "0*76", "0*0B", "0*4A", "0*72", "0*6B", > > "0*4E", "0*38", "0*04", "0*11", "0*17", "0*18", "0*6B", "0*64", > > "W", "0*53", "0*32", "2*20", NA, "0*61", "0*1C", "0*79", "0*16", > > "0*44", "0*53", "0*04", "0*2D", "0*1C", "0*07", "2*37", "0*12", > > "0*2D", "0*30", "0*6D", "0*25", "0*26", "0*75", "2*2D", "0*71", > > "0*38", "0*6D", "0*0F", "0*34", "0*1D", "0*70", "0*47", "0*70", > > "0*4C", "0*54", "W", "0*64", "0*66", "0*69", "0*0C", "0*70", > > NA, "0*11", "0*28", "0*38", "0*30", "0*1F", "0*64", "0*7C", "0*38", > > "0*67", "0*57", "0*59", "0*75", "0*52", "0*18", "0*08", "0*5F", > > "0*26", "0*3B", "0*67", "0*6A", "2*24", "0*47", "0*65", "0*56", > > "0*54", "2*76", "0*23", "W", "0*3B", "0*1D", "0*11"), ...8 = > c(1485907200, > > 1485907200, 1485907200, 1485907200, 1485907200, 1485907200, 1485907200, > > 1485907200, 1485907200, 1485907200, 1485907200, 1485907200, 1485907200, > > 1485907201, 1485907201, 1485907201, 1485907201, 1485907201, 1485907201, > > 1485907201, 1485907201, 1485907201, 1485907201, 1485907201, 1485907201, > > 1485907201, 1485907201, 0.008, 1485907201, 1485907201, 1485907201, > > NA, 1485907203, 1485907203, 1485907203, 1485907203, 1485907203, > > 1485907203, 1485907203, 1485907204, 1485907204, 1485907204, 1485907204, > > 1485907204, 1485907204, 1485907204, 1485907204, 1485907204, 1485907204, > > 1485907204, 1485907205, 1485907205, 1485907205, 1485907205, 1485907205, > > 1485907205, 1485907205, 1485907206, 1485907206, 1485907206, 1485907206, > > 1485907206, 0.01, 1485907206, 1485907206, 1485907206, 1485907206, > > 1485907206, NA, 1485907206, 1485907206, 1485907206, 1485907206, > > 1485907206, 1485907206, 1485907206, 1485907208, 1485907208, 1485907208, > > 1485907208, 1485907208, 1485907209, 1485907209, 1485907209, 1485907209, > > 1485907209, 1485907209, 1485907209, 1485907209, 1485907209, 1485907209, > > 1485907209, 1485907209, 1485907209, 1485907209, 1485907209, 0.005, > > 1485907209, 1485907209, 1485907209), ...9 = c(NA, NA, NA, NA, > > NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, > > NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "*41", NA, NA, NA, > > NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, > > NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, > > NA, "*43", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, > > NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, > > NA, NA), ...10 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, > > NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, > > 10217, NA, NA, NA, 1485907201, NA, NA, NA, NA, NA, NA, NA, NA, > > NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, > > NA, NA, NA, NA, NA, NA, 10217, NA, NA, NA, NA, NA, 1485907206, > > NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, > > NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 10217, NA, NA, NA > > ), ...11 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, > > NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, > > NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, > > NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, > > NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, > > NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, > > NA, NA, NA, NA, NA, NA, NA, NA), ...12 = c(NA, NA, NA, NA, NA, > > NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, > > NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, > > NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, > > NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, > > NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, > > NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), > > ...13 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, > > NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, > > "D*6F", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, > > NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, > > NA, NA, NA, NA, NA, NA, "D*60", NA, NA, NA, NA, NA, NA, NA, > > NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, > > NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "D*63", NA, NA, > > NA), ...14 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, > > NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, > > NA, 1485907201, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, > > NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, > > NA, NA, NA, NA, NA, NA, NA, NA, 1485907206, NA, NA, NA, NA, > > NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, > > NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1485907209, > > NA, NA, NA)), row.names = c(NA, -100L), class = "data.frame") > > > > To tested your function I took the first message, which is located in the > > 6th column and the 1st row, and did the following: > > > > library(stringi) > > library(dplyr) > > library(R.utils) > > library(RANN) > > library(NISTunits) > > library(pracma) > > library(celestial) > > library(stringr) > > > > dat <- readXL("U:/RawSampleData.xls", rownames=FALSE, header=FALSE, > na="", > > + sheet="RawSampleData", stringsAsFactors=FALSE) > > > > testmessage1 <- dat[1,6] > > > > ascii_datformat <- utf8ToInt(testmessage1) > > > > Base <- ascii_datformat - 48 > > > > decy <- ifelse(Base > 40, Base - 8, Base) > > > > biny <- intToBin(decy) > > > > binyframe <- data.frame(biny) > > > > tbinyframe <- paste(t(binyframe[,1]), collapse="") #at this point, I > have > > the complete first message, all in binary format > > > > #according to the literature of AIS message decoding, longitude goes from > > position 62 to position 89 > > #and latitude goes from position 90 to position 116 > > > > longitude <- substr(tbinyframe, 62, 89) > > latitude <- substr(tbinyframe, 90, 116) > > > > #now I apply the function you provided me with: > > > > fun <- function(x){ > > res <- sapply(x, function(y){ > > if(nchar(y) %% 8 != 0 || substr(y, 1, 1) == "0"){ > > strtoi(y, base = 2) > > }else{ > > y <- unlist(strsplit(y, "")) > > -sum((y != "1")*2^((length(y) - 1):0)) - 1 > > } > > }) > > unname(res) > > } > > > > > fun(longitude) > > [1] 220663102 > > > > > > fun(latitude) > > [1] 5414823 > > > > > > fun("1101001001110000110100111110") > > [1] 220663102 > > > > > > fun("000010100101001111110100111") > > [1] 5414823 > > > > > > fun("10110010") > > [1] -78 > > > > as you can see, the function only worked or showed expected result on the > > last case with a -78, but in the other cases, it the results were not as > > expected, maybe I am missing something here? > > > > Any help and/or guidance will be greatly appreciated, > > > > Best regards, > > > > Paul > > > > El lun., 20 ene. 2020 a las 10:28, Rui Barradas (<ruipbarra...@sapo.pt>) > > escribió: > > > > > Hello, > > > > > > The function I included converts signed binary numbers into their > > > decimal representation. They are negative if a) they are multiples of 8 > > > bits and b) the most significant bit is a "1". If not just convert to > > > integer. > > > > > > As for a) above, I assume that you will have 8 bit numbers. And the > > > conversion is done as follows: > > > > > > input: 10110010 > > > > > > splitting, to make it more clear: > > > > > > 1 0 1 1 0 0 1 0 - input > > > 0 1 0 0 1 1 0 1 - reversed > > > 1 - add 1 to the number with reversed bits > > > 0 1 0 0 1 1 1 0 - result is the two's complement > > > > > > c(0, 1, 0, 0, 1, 1, 1, 0) %*% 2^(7:0) is 78 > > > > > > But the msb is "1" so it's -78 > > > > > > > > > This is what the function does, but instead of %*% it uses > > > > > > sum(two's compl * powers of two) > > > > > > > > > Hope this helps, > > > > > > Rui Barradas > > > > > > The input must be a character string or character vector. > > > > > > Às 14:36 de 20/01/20, Paul Bernal escreveu: > > > > Dear friend Rui, > > > > > > > > Hope you are doing great, thanks for your kind feedback. The > challenge I > > > > currently have at hand is to decode AIS messages and obtain latitude > and > > > > longitude values from those. > > > > > > > > So basically, I want to accomplish something like in the example > below. > > > > I want to convert this binary number (10110010) into the two´s > > > > complement representation, there is the logic they are using for > that. > > > > Since longitude ranges from > > > > > > > > > > > > Example of conversion to decimal of a signed binary number in > > > > two's complement representation > > > > > > > > Let's convert to decimal the following signed binary number: 10110010 > > > > > > > > 10110010 = -1×27 + 0×26 + 1×25 + 1×24 + 0×23 + 0×22 + 1×21 + 0×20 = > -128 > > > > + 32 + 16 + 2 = -78. > > > > > > > > El lun., 20 ene. 2020 a las 7:22, Rui Barradas (< > ruipbarra...@sapo.pt > > > > <mailto:ruipbarra...@sapo.pt>>) escribió: > > > > > > > > Sorry, missunderstood the problem. > > > > Here it goes: > > > > > > > > fun <- function(x){ > > > > res <- sapply(x, function(y){ > > > > if(nchar(y) %% 8 != 0 || substr(y, 1, 1) == "0"){ > > > > strtoi(y, base = 2) > > > > }else{ > > > > y <- unlist(strsplit(y, "")) > > > > -sum((y != "1")*2^((length(y) - 1):0)) - 1 > > > > } > > > > }) > > > > unname(res) > > > > } > > > > > > > > fun("10110010") > > > > fun("10000000") > > > > fun(c("01000000", "01111111", "10110010", "10000000")) > > > > > > > > > > > > Hope this helps, > > > > > > > > Rui Barradas > > > > > > > > Às 11:38 de 20/01/20, Rui Barradas escreveu: > > > > > Hello, > > > > > > > > > > Is this what you want? > > > > > > > > > > > > > > > x <- "10110010" > > > > > strtoi(x, base = 2) > > > > > #[1] 178 > > > > > > > > > > > > > > > Hope this helps, > > > > > > > > > > Rui Barradas > > > > > > > > > > Às 16:31 de 16/01/20, Paul Bernal escreveu: > > > > >> Dear friends, > > > > >> > > > > >> How can I convert the following binary number in two´s > complement > > > > >> representation in R? > > > > >> > > > > >> 10110010 > > > > >> > > > > >> Any help and/or guidance will be greatly appreciated, > > > > >> > > > > >> Best regards, > > > > >> > > > > >> Paul > > > > >> > > > > >> [[alternative HTML version deleted]] > > > > >> > > > > >> ______________________________________________ > > > > >> R-help@r-project.org <mailto:R-help@r-project.org> mailing > list > > > > -- To UNSUBSCRIBE and more, see > > > > >> https://stat.ethz.ch/mailman/listinfo/r-help > > > > >> PLEASE do read the posting guide > > > > >> http://www.R-project.org/posting-guide.html > > > > >> and provide commented, minimal, self-contained, reproducible > > > code. > > > > >> > > > > > > > > > > ______________________________________________ > > > > > R-help@r-project.org <mailto:R-help@r-project.org> mailing > list > > > > -- To UNSUBSCRIBE and more, see > > > > > https://stat.ethz.ch/mailman/listinfo/r-help > > > > > PLEASE do read the posting guide > > > > > http://www.R-project.org/posting-guide.html > > > > > and provide commented, minimal, self-contained, reproducible > code. > > > > > > > > > > > [[alternative HTML version deleted]] > > > > ______________________________________________ > > R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see > > https://stat.ethz.ch/mailman/listinfo/r-help > > PLEASE do read the posting guide > http://www.R-project.org/posting-guide.html > > and provide commented, minimal, self-contained, reproducible code. > [[alternative HTML version deleted]] ______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.