Je travaille sur un projet de bus CAN et j'essaie d'envoyer un message pour régler l'heure et la date. J'ai déterminé comment le message doit être formaté, saisi la date / l'heure et stocké dans des variables. Je les ai convertis en hexadécimal très bien, mais je dois ajouter des 0 de début à pad à l'espace requis par le message.
J'ai essayé des méthodes vues en ligne pour un script bash, mais j'ai un problème: L'année 2019 est 7E3 en hexadécimal. J'ai besoin de cela affiché comme 07E3. Lorsque vous utilisez awk pour ajouter les 0 de début, l'E3 est interprété comme la notation d'ingénierie * 10 ^ 3, et donc imprimé comme 7000. Mon script est ci-dessous, avec une image montrant le format de message du bus CAN. Toute aide est appréciée.
#!/bin/bash #Store Date/Time in Variables Year=`date '+%Y'` Month=`date '+%m'` Day=`date '+%d'` Hour=`date '+%H'` Minute=`date '+%M'` Second=`date '+%S'` #Convert Date/Time to Hexadecimel HexYear=`echo "ibase=10;obase=16;$Year"| bc | awk '{ printf("%04d\n", $1) }'` HexMonth=`echo "ibase=10;obase=16;$Month"| bc | awk '{ printf("%02d\n", $1) }'` HexDay=`echo "ibase=10;obase=16;$Day"| bc | awk '{ printf("%02d\n", $1) }'` HexHour=`echo "ibase=10;obase=16;$Hour"| bc | awk '{ printf("%02d\n", $1) }'` HexMinute=`echo "ibase=10;obase=16;$Minute"| bc | awk '{ printf("%02d\n", $1) }'` HexSecond=`echo "ibase=10;obase=16;$Second"| bc | awk '{ printf("%02d\n", $1) }'` echo "The following is Decimel > Hex" echo "$Year > $HexYear" echo "$Month > $HexMonth" echo "$Day > $HexDay" echo "$Hour > $HexHour" echo "$Minute > $HexMinute" echo "$Second > $HexSecond"
3 Réponses :
Tout ce echo | bc | awk
pourrait être réduit à
$: HexYear=$( printf "%04X\n" $Year ) $: echo "$Year > $HexYear" 2019 > 07E3
X> x, car il ne nécessite pas que la variable soit déclarée en majuscule.
J'ai essayé cette approche, mais j'obtiens la réponse suivante: ./DateSet.sh: ligne 13: declare: -u: option invalide declare: usage: declare [-afFirtx] [-p] [nom [= valeur] ... ] Ce qui suit est Decimel> Hex 2019> 01> 01 04> 04 22> 16 55> 37 35> 23
Désolé, je ne sais pas pourquoi cela n'a pas été formaté correctement. Ceci imprimé comme 2019> ____ (juste un espace vide). Je ne sais pas pourquoi. Le vôtre et la réponse ci-dessous ont aidé à résoudre ce problème, merci.
Modifié - a ignoré la déclaration en majuscules de la variable en faveur de l'utilisation de X vs x. Désolé, vous avez eu des problèmes, et vous êtes les bienvenus.
La réponse dans awk, comme dans les autres formats de printf
, est % 0X
, par exemple:
$ printf "%02X%02X%04X\n" `date '+%m %d %Y'` 010407E3
Le x
est pour heXadecimal, la casse des chiffres AF correspond à celle de la lettre, et le 0
est pour les zéros non significatifs, après quoi vous pouvez spécifier la largeur souhaitée (par exemple, complétez à quatre chiffres avec des zéros en majuscules: %04X
).
Et si vous n'avez pas besoin de awk pour autre chose (comme pour traiter plusieurs lignes), utilisez simplement printf directement: p>
$ echo 2019 01 04 | awk '{ printf("%02X%02X%04X\n", $2, $3, $1) }' 010407E3
Merci, cela m'a aidé à y arriver. Mon code a été simplifié comme suit: HexYear = $ (printf "% 04X \ n" $ Year) HexMonth = $ (printf "% 02X \ n" $ Month)
Vous devez réaliser à quel point il est extrêmement inefficace d'appeler 6 fois date
alors que vous pouvez l'appeler une fois, puis d'appeler bc
+ awk
pour faire quelque chose que awk
pourrait faire seul, puis le faire 6 fois également. Prenez une seconde pour vraiment réfléchir à ce que fait votre script.
Regardez ceci avec date
plus n'importe quel awk:
$ hex=( $(awk 'BEGIN{dec=strftime("%Y %m %d %H %M %S"); split(dec,a); hex=sprintf("%X %X %X %X %X %X",a[1],a[2],a[3],a[4],a[5],a[5]); print hex}') ) $ declare -p hex declare -a hex=([0]="7E3" [1]="1" [2]="5" [3]="8" [4]="1F" [5]="1F")
Merci pour le conseil. Ne vous inquiétez pas de l'inefficacité pour le moment, car il ne s'agit que de tester des théories pour m'assurer qu'elles sont correctes. Le projet sera soit écrit en python ou C, ce ne sont que mes premiers pas dans les tests.
Appeler date 6 fois, etc., me rend immédiatement évident (un humain) ce que le code essaie de faire. Les humains doivent également lire le code, et les heures-homme (hu) sont bien plus chères que les heures CPU.