string dekódolása

Fórumok

Sziasztok.

Adott egy string, mely tartalmazhat különleges karaktereket, space-et is.

Nem tudom, miért reagál így:


#echo "!AIVDM,1,1,,A,13u?etPv2;0n:dDPwUM1U1Cb069D,0*24" | base64 --decode
bash: !AIVDM,1,1,,A,13u?etPv2: event not found
#

valamit nem tudok jól a base64 kezelésében, vagy tényleg olyan a kód, ami nem is base64?

----------
Frissítés: topicnévben base64 szerepelt, de alábbi kérésre a tévedésemen alapuló címet kicseréltem. A fentieket így hagyom, különben a hozzászólások egy része (amelyben az szerepel, hogy ez nem base64 kód) értelmét vesztené

Hozzászólások

Az egyes bithatosokat reprezentáló karakterek (64 db) az alábbiak: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

A kódolt szövegben előfordulhat még:
-egyenlőségjel ('='), amellyel a kódolt szöveget szokás néggyel osztható hosszúságúra kiegészíteni
-kocsi-vissza, a visszafejtésnél figyelmen kívül kell hagyni
-soremelés, a visszafejtésnél figyelmen kívül kell hagyni

wikipedia

A kapott stringet már maga az echo sem eszi meg.

Talán ennyi belőle a base64 kódolt rész : "dDPwUM1U1Cb069D"

Ennek baba a kimenete.
Az eredeti demo ez:


# php ais.php 
Message Type= 1
Repeat Indicator= 0
MMSI= 366913120
Navigation Status= 0
Rate of Turn (ROT)= 0
Speed Over Ground (SOG)= 0
Position Accuracy= 0
Longitude= 229663059
Latitude= 10992713
Course over Ground (COG)= 329.5
True Heading(HDG)= 299
Time Stamp= 16
Maneuver Indicator= 0
Spare= 0
RAIM flag= 1
Radio Status= 98890

Az én hajóazonosíytóm meg ezen php-kód alapján ez:


# php ais.php 
Message Type= 49
Repeat Indicator= 1
MMSI= 93951095
Navigation Status= 12
Rate of Turn (ROT)= 7
Speed Over Ground (SOG)= 76.9
Position Accuracy= 1
Longitude= 242782080
Latitude= 71258039
Course over Ground (COG)= 320.3
True Heading(HDG)= 449
Time Stamp= 5
Maneuver Indicator= 2
Spare= 0
RAIM flag= 0
Radio Status= 221868

Kezd tetszeni a dolog :)
Most valahogy átültetem BASH-ba az egészet.

Köß szépen

Ez egyrészt nem base64 hanem AIVDM, másrészt a hibaüzenetet a bash-tól kapod, nem a base64-től.

https://rl.se/aivdm
!AIVDM,1,1,,A,13u?etPv2;0n:dDPwUM1U1Cb069D,0*24

Message sent (UTC) : 17:21:53
MMSI : 265547250
Latitude : 57.660353°
Longitude : 11.832977°
Speed : 13.9 knots
Heading : 41°
Course over ground : 40°
Rate of turn : -2°/min
Navigational status: 0
Nearest place : Styrsö, Sweden

RL.SE AIVDM/AIVDO Decoder, build #213

És hogy akkor ez is le legyen írva: a bash (amúgy a C-shelltől örökölt módon) a parancssorban szereplő !akármi sztringet korábbi parancsra vonatkozó hivatkozásnak tekinti. Az "akármi" lehet előjel nélküli szám (ekkor az ilyen sorszámú parancs), negatív szám (ekkor az ennyivel ezelőtti parancs) illetve sztring (amikor is a legutolsó ezzel a sztringgel kezdődő parancs), illetve ?sztring (a legutolsó, a sorban bárhol ezt a sztringet tartalmazó parancs) lesz behelyettesítve az általad begépelt utasításban az !akármi helyére. Kb ugyanúgy, ahogy a $valami változóhelyettesítést \$valami vagy épp '$valami' formában tudod takarni a shell elől, de "$valami" esetén van helyettesítés; itt is \!akármi vagy épp '!akármi' formában írható, de !akármi és "!akármi" helyettesítődne.

További furcsaságokhoz RTFM, man bash

=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?

hadd javasoljam a topic átnevezését, mert ez itt nem b64, ha még decode is

libais csomag sikeresen fel lett telepítve (leforgatva) debianon és armv6-on ARCH lunixra.
Kellett nekik a python-six csomag is, nálam most az 1.6-os verzió van fenn.

Szóval ez a sor:


!AIVDM,1,1,,B,13E`Tn8P00OorbHjWstI?w20D0B,0*1B

(amiből kihagytam az "Tn8P00Oo" után egy "<" jelet, hogy a hup formja ne akadjon ki) ezzel átgyúrva
cat ./ais.log | aisdecode
eredményezi ezt a kimenetet:

{"special_manoeuvre": 0, "position_accuracy": 0, "nav_status": 8, "rot_over_range": true, "received_stations": 18, "true_heading": 511, "x": -1.9219916666666668, "mmsi": 224011480, "slot_timeout": 5, "y": 43.32541166666667, "spare": 0, "timestamp": 33, "repeat_indicator": 0, "id": 1, "raim": false, "sync_state": 0, "cog": 317.20001220703125, "sog": 0.0, "rot": -731.386474609375}

Ez a cgps NMEA-mondataihoz hasonlóan van versbe szedve, sejtésem szerint valami json-jellegű a dolog, melyhez szintén nem volt még szerencsém, csakúgy, mint a nawk-hoz és a gawk-hoz...

Kérdésem most az, miként lehet ezeket kezelni, azaz "rekordonként" sorokba írni? awk-val sima ügy, de inkább szaxerűbben szeretném ezt megtenni.

---
--- A gond akkor van, ha látszólag minden működik. ---
---

A kimeneted egy .json fájl, lerakod fájlba, majd az alábbit berakod egy .php fájlba (feltételezem, hogy a .json fájl szabályos és teljes):


<?php

// file.json helyére beirod a fájl nevet
// 1-es a végére azért kell, hogy tömbbé alakítsa, ne objektummá
$json = file_get_contents('file.json');
$tmp = json_decode($json,1);

// végigmész a sorokon
foreach ($tmp as $id => $val){

// ha html-be akarod a kimenetet, akkor a \n helyére < br > -t írj
echo( $id . ' : ' . $val . "\n" );

}

"?>"-jelekkel zártam a scriptet, kipróbáltam, ezt kaptam:

PHP Warning: Invalid argument supplied for foreach() in /opt/ais/ais-php.php on line 3

Közben egy iszonyatosan nagy AJAX-könyvben megtaláltam a 296. oldalon a decode() metódust, csak az más kód, más dologra.

---
--- A gond akkor van, ha látszólag minden működik. ---
---