2009-12-31 6 views
0

Je suis dans un petit problème ici. Quelqu'un peut-il m'aider à implémenter une solution qui inverse chaque octet de sorte que 0xAB devient 0xBA mais et non alors "abcd" devient "dcba". J'en ai besoin ABCD EF devient BA DC FE.Inverser tous les caractères dans un fichier

De préférence en C ou C++ mais cela n'a pas vraiment d'importance à condition qu'il puisse fonctionner. Jusqu'à présent, j'ai implémenté une solution UBER CRAPPY qui ne fonctionne même pas (et oui, je sais que la conversion en chaîne et retour en binaire est une solution merdique) dans PureBasic.

OpenConsole() 
filename$ = OpenFileRequester("Open File","","All types | *.*",0) 
If filename$ = "" 
End 
EndIf 
OpenFile(0,filename$) 
*Byte = AllocateMemory(1) 
ProcessedBytes = 0 
Loc=Loc(0) 
Repeat 
FileSeek(0,Loc(0)+1) 
PokeB(*Byte,ReadByte(0)) 
BitStr$ = RSet(Bin(Asc(PeekS(*Byte))),16,"0") 
FirstStr$ = Left(BitStr$,8) 
SecondStr$ = Right(BitStr$,8) 
BitStr$ = SecondStr$ + FirstStr$ 
Bit.b = Val(BitStr$) 
WriteByte(0,Bit) 
ProcessedBytes = ProcessedBytes + 1 
ClearConsole() 
Print("Processed Bytes: ") 
Print(Str(ProcessedBytes)) 
Loc=Loc(0) 
Until Loc = Lof(0) 
Delay(10000) 

Merci d'avoir lu.

+0

Ça sent le devoir. –

+1

Qui fait ses devoirs le 31 décembre ??? –

Répondre

8

En lisant votre code PureBasic (j'ai d'abord ignoré), il semble que vous voulez permuter endian, même si ce n'est pas ce que votre texte demande — 0xAB signifie pratiquement toujours un octet avec la valeur décimale 171, pas deux octets, et il est extrêmement commun d'afficher un octet comme deux chiffres hexadécimaux, où vous utilisez AF dans votre exemple.

#include <iostream> 
int main() { 
    using namespace std; 
    for (char a; cin.get(a);) { 
    char b; 
    if (!cin.get(b)) { 
     cout.put(a); // better to write it than lose it 
     cerr << "Damn it, input ends with an odd byte, is it in " 
     "the right format?\n"; 
     return 1; 
    } 
    cout.put(b); 
    cout.put(a); 
    } 
    return 0; 
} 
// C version is a similar easy translation from the original code 

import numpy 
import sys 
numpy.fromfile(sys.stdin, numpy.int16).byteswap(True).tofile(sys.stdout) 

réponse originale:

Je ne sais pas pourquoi vous voulez que cela (il ne convertit pas endian, par exemple, si vous voulez cela), mais voilà:

#include <stdio.h> 
int main() { 
    for (char c; (c == getchar()) != EOF;) { 
    putchar((c & 0xF << 4) | ((int)c & 0xF0 >> 4)); 
    } 
    return 0; 
} 

#include <iostream> 
int main() { 
    for (char c; std::cin.get(c);) { 
    std::cout.put((c & 0xF << 4) | ((int)c & 0xF0 >> 4)); 
    } 
    return 0; 
} 

import sys 
for line in sys.stdin: 
    sys.stdout.write("".join(
    chr((ord(c) & 0xF << 4) | (ord(c) & 0xF0 >> 4)) 
    for c in line 
)) 

Tous partent du principe que les traductions de texte ne se produisent pas (comme \n-\r\n et vice versa); vous devrez les changer pour ouvrir des fichiers en mode binaire si c'est le cas. Ils lisent depuis stdin et écrivent sur stdout, si vous n'êtes pas familier avec cela, utilisez simplement programname <inputfile> outputfile pour les exécuter.

+2

+1 pour les trois versions:> –

+0

Je pense que nous devrions juste continuer à ajouter à cette réponse, donc ici, ayez une ligne: 'perl -ne 'print chr ($ _ & 15 << 4) | ($ _ & 240 >> 4) pour map ord, split //, $ _ '' –

2

Inverser la haute et basse de demi-octet est possible par une simple formule arithmétique (en supposant fonctionner sur des octets non signés):

reversed = (original % 16) * 16 + (original/16); 
+1

Faites juste attention aux problèmes de signature (c'est la raison pour laquelle j'ai répondu), qui s'applique à la fois aux opérations arithmétiques et binaires. (255 -> -1, -1/16 est 0, pas 15) –

+0

True, a édité ma réponse. –

0

Une solution Haskell:

module ReverseBytes where 

import qualified Data.ByteString as B 
import Data.Bits 
import Data.Word 

----------------------------------------------------------- 

main :: IO() 
main = B.getContents >>= B.putStr . B.map reverseByte 

reverseByte :: Word8 -> Word8 
reverseByte = flip rotate 4 

runghc ReverseBytes.hs <inputfile> outputfile 
Questions connexes