0

ここで少し困っています。

0xABが0xBAになるが、「abcd」が「dcba」にならないように、すべてのバイトを逆にするソリューションを実装するのを手伝ってくれる人はいますか。AB CD EF が BA DC FE になるように必要です。

できれば C または C++ ですが、実行できれば問題ありません。

これまでのところ、PureBasic で動作しない UBER CRAPPY ソリューションを実装しました (もちろん、文字列に変換してからバイナリに戻すのはくだらないソリューションであることはわかっています)。

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)

読んでくれてありがとう。

4

3 に答える 3

8

PureBasic コードを読むと (最初はスキップしました)、エンディアンを交換したいようですが、テキストが求めているものではありません。0xAB は実際には常に 2 バイトではなく 10 進数値 171 のバイトを意味し、非常に一般的です。例で AF を使用する場合、1 バイトを 2 桁の 16 進数として表示します。

#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)

元の答え:

なぜこれが必要なのかはわかりませんが(たとえば、それが必要な場合はendian を変換しません)、次のようになります。

#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
  ))

いずれも、テキストの変換が発生しないことを前提としています ( \nto\r\nやその逆など)。その場合は、ファイルをバイナリ モードで開くように変更する必要があります。それらは標準入力から読み取り、標準出力に書き込みます。慣れていない場合は、programname < inputfile > outputfileそれらを実行するために使用してください。

于 2009-12-31T07:45:19.813 に答える
2

上位半バイトと下位半バイトを逆にすることは、単純な算術式によって可能です (符号なしバイトを操作すると仮定します)。

reversed = (original % 16) * 16 + (original / 16);
于 2009-12-31T07:46:18.787 に答える
0

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
于 2009-12-31T08:16:04.513 に答える