Newsgroup: it.comp.os.linux.iniziare
Titolo: Bash lettura binaria e conversione in numero

Salve a tutti
Sto cercando tramite script bash, di leggere un file ed estrarre un
valore scritto in binario.
Tramite l'opzione di estrazione da una stringa echo ${String:32:2},
riesco ad inserire in un'altra i caratteri che cerco.
Ora, come faccio a convertire questa stringa (contenente caratteri
ascii) in numero?
Grazie
Sergio

 ascii) in numero?
Non volevi leggere un file binario e scriverlo in ASCII? 
Molto coerente, fai il contrario di ciò che dici.
PS man printf



Se ho capito bene, data una stringa contenente una rappresentazione 
binaria di un numero vorresti convertirla in decimale
In questo caso ti puo' aiutare bc
man bc
per es il numero 8 
echo 'ibase=2;obase=A;1000' | bc
-- 
.,¸¸,ø¤º°°º¤ø,¸_¸cRuncH.,¸¸,ø¤º°°º¤ø,¸_¸
           and....yes, we crunch
 
Questa potrebbe davvero essere la scintilla che fa traboccare la goccia.
		-- Fabio Noaro, telecronista sportivo, ripreso in
		   "Mai Dire Gol"

Il 24-06-2011, sergio dice:

Penso ti convenga seguire i consigli che t'han gia' dato,
ma se vuoi provare (tentar non nuoce) vedi "od --help"
oppure man od, o anche "info coreutils 'od invocation'".
Anche dd fa qcs del genere per certi versi, infine guardati
hexdump (sempre man o --help o prova info blablabla).
Se poi invece posti la stringa da elaborare magari (basta
un esempio) anche altri piu' pratici di me te la traducono
al volo nel formato che vuoi.
-- 
Saluti, Dalet

 adatta per fare tutto.
Purtroppo è un'applicativo che deve funzionare anche senza perl....
Grazie comunque della risposta

 Purtroppo è un'applicativo che deve funzionare anche senza perl....
1) Usa AWK, PYthon, Ruby, C...
2) Risposta del cavolo. Mentre perl è presente in tutte le
installazioni Unix, BASH non è installata in tutti i siatemi
come Solaris, e i sistemi basati su busybox.

 come Solaris, e i sistemi basati su busybox.
Ah si'? I sistemi basati su busybox hanno perl? Interessante.
-- 
Cio' che si vede, e'.


No, ragazzi, sono proprio alla frutta!!!!!
Ho un file dal quale devo estrarre un numero binario del quale so la
posizione
FileRead=$(cat /path/nome_file)            # legge il file binario e
lo mette in FileRead
BinNum=`echo ${FileRead:33:2}`           # Estrae dal file i bite 33 e
34 e li mette dentro BinNum
Ora questi due caratteri li ho nella variabile BinNum. Come faccio a
convertire questi due caratteri nel numero che cerco???
Ho provato con i suggerimenti di crunch e dalet, ma non funzionano.
Per quanto riguarda il suggerimento di mallin.shetland non posso
utilizzarlo, in quanto non so (e non posso correre il rischio) che non
ci sia perl installato.
Devo farlo per forza (se mi date una mano) in bash

 convertire questi due caratteri nel numero che cerco???
valore = 0
for i in 1 2
do
	if ${BinNum:i:1) = "1"
	then
		let valore=valore + 2^(i-1)
	fi
done

Ho provato con i suggerimenti di crunch e dalet, ma non funzionano.
Secondo me dovresti dare un esempio concreto di tutto
questo che dici, cioe' di' cosa sono, un caso di questi
due caratteri, perche' i caratteri (praticamente byte con
macchine intel) in origine possono essere valori numerici
espressi in molti modi, esempio magari da te e' in ottale,
e poi echo ci aggiunge pure i \n, non c'hai pensato?
Esempio.
pippo=123; echo $pippo:1:1} | hexdump -C
00000000  32 0a                                             |2.|
00000002
dunque ti da' gli esadecimali: 32 che e' il 2 ascii piu'
lo 0a che e' appunto il newline.
Tu devi dire in che *formato* vuoi l'uscita finale e magari
pure per cosa ti servono o cosa ci devi fare.
E poi anche l'ingresso puo' rappresentare diverse cose,
specie trattandosi d'un file binario.
-- 
Saluti, Dalet

Andrea B. ha scritto:

Se ho capito bene, per binario lui intende un intero, con segno o
senza segno.
Altrimenti, con due caratteri, se la cava con tre if. :-)
E io non lo saprei fare di sola bash, almeno un od -d
-- 
           |Save our planet!
    Ciao   |Save wildlife!
   roberto |For your E-MAIL use ONLY recycled Bytes  !!
           |roberto poggi   
rpo...@softhome.net

 in numero?
aggiungi un po' di gestione errori (caratteri divesi da 0 o 1,
overflow, etc)
% bin_to_10 () { b=$1 ; res=0 ; powoftwo=1
                 while [ $b ] ; do
                     last=${b: -1}
                     b=${b/%$last/}
                     res=$(($res + $powoftwo * $lastt))
                     powoftwo=$(($powoftwo * 2))
                 done; echo $res
                 }
% bin_to_10 10010110
150
% 
-- 
UN CADAVERE NEL PIATTO!                            -- Elena,   in IFQ

 senza segno.
se mette i valori dei due caratteri in due variabili separate tipo:
v1 e v2 potrebbe fare una cosa tipo
let ms=$(($(printf "%d" \'"$v1")*256))
let ls=$(($(printf "%d" \'"$v2")))
echo $(($ms+$ls))

                      res=$(($res + $powoftwo * $lastt))
                                                 $last


                      res=$(($res + $powoftwo * $last))


 convertire questi due caratteri nel numero che cerco???
Facendo seguito a quanto detto prima
BinNum=10 ; echo "ibase=2;$BinNum" | bc
diversamente concordo con chi ti chiede di spiegare meglio cosa intendi
-- 
.,¸¸,ø¤º°°º¤ø,¸_¸cRuncH.,¸¸,ø¤º°°º¤ø,¸_¸
           and....yes, we crunch
 
Favola russa.  C'era una vodka...
		-- Gino Patroni


Il problema è questo:
devo leggere un file binario da dove devo estrarre, in posizioni che
conosco, dei valori che possono essere o interi, o lunghi ecc.
Nel caso specifico devo estrarre dalla byte 33 e 34, i valori che mi
ritorneranno un intero e che mi dicono lo spostamento di un altro
record nel file.

 conosco, dei valori che possono essere o interi, o lunghi ecc.
Allora bash da solo non basta.
Che ambiente hai?
Quali comandi "standard" hai a disposizione?


 Quali comandi "standard" hai a disposizione?
Quoto.
Uno script in Python è di sicuro più semplice da scrivere.
Ad esempio (codice alla brutta, si può rendere molto più bello):
--8<---cut---
f = open("ciccio.txt","rb")
f.seek(33)
bh = ord(f.read(1))
bl = ord(f.read(1))
pw = bh*256+bl # word senza segno, little-endian
f.close()
--8<---cut---
oppure, un po' più sofisticato:
--8<---cut---
import struct
#apri il file
f = open("ciccio.txt","rb")
#vai al byte 33, please
f.seek(33)
# leggi 2 byte
s = f.read(2)
# Il file non mi serve più, chiudilo pure
f.close()
# prendi il valore interpretandolo come word senza segno
pw_le = struct.unpack("H",s)[0] 
--8<---cut---
Casomai python non fosse disponibile, un programmino in c si scrive e si 
compila in pochi secondi.
--8<---cut---
#include <stdio.h>
#include <stdlib.h>
int main(void) {
  FILE *fp;
  unsigned short pw;
  fp = fopen("ciccio.txt","rb");
  fseek(fp, 33, SEEK_SET);
  fread(&pw, 2, 1, fp);
  fclose(fp);
  printf("Il valore è %u\n",pw);
  return 0;
}
--8<---cut---
La compilazione porta ad un eseguibile solo da 7kB che lanciato ti 
fornisce subito il risultato, senza scomodare altri programmi come awk, 
hexdump et simili.
Come è già stato detto, bash fa tanto, ma non è questo il suo lavoro.
Luca

 nel file.
quindi ricapitolando, data una stringa contenente due caratteri vorresti 
ottenere il loro valore corrispondente sulla tabella ascii
io procederei singolarmente in questo modo
BinNum=F ; printf '%d\n' "'$BinNum"
BinNum2=5 ; printf '%d\n' "'$BinNum2"
domanda: a che serve?
-- 
.,¸¸,ø¤º°°º¤ø,¸_¸cRuncH.,¸¸,ø¤º°°º¤ø,¸_¸
           and....yes, we crunch
 
Meeting al Club Paranoia venerdi' prossimo.  Ora...  prova a trovare
dove!