首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >反转文件中的每个字符

反转文件中的每个字符
EN

Stack Overflow用户
提问于 2009-12-31 07:37:47
回答 3查看 231关注 0票数 0

我在这遇到了点小麻烦。

有谁能帮我实现一个解决方案,使每个字节都反转,使0xAB变为0xBA,而不是,而不是,使"abcd“变为"dcba”。我需要它,以便AB光盘EF成为BA DC FE。

最好是在C或C++中,但是如果它能够运行的话,这并不重要。

到目前为止,我已经在PureBasic中实现了一个甚至不起作用的优步糟糕的解决方案(是的,我知道转换到字符串并返回到二进制是一个糟糕的解决方案)。

代码语言:javascript
复制
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)

感谢您的阅读。

EN

回答 3

Stack Overflow用户

发布于 2009-12-31 07:45:19

阅读您的PureBasic代码(我一开始跳过它),您似乎确实想要交换endian,尽管这并不是您的文本要求的-0xAB实际上总是指一个具有十进制值的字节,而不是两个字节,并且在示例中使用at显示一个字节作为两个十六进制数字是非常常见的。

代码语言:javascript
复制
#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

代码语言:javascript
复制
import numpy
import sys
numpy.fromfile(sys.stdin, numpy.int16).byteswap(True).tofile(sys.stdout)

原来的答案:

我不知道您为什么要这样做(例如,如果您想要这样做的话,it不转换endian ),但是下面是:

代码语言:javascript
复制
#include <stdio.h>
int main() {
  for (char c; (c == getchar()) != EOF;) {
    putchar((c & 0xF << 4) | ((int)c & 0xF0 >> 4));
  }
  return 0;
}

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

代码语言:javascript
复制
import sys
for line in sys.stdin:
  sys.stdout.write("".join(
    chr((ord(c) & 0xF << 4) | (ord(c) & 0xF0 >> 4))
    for c in line
  ))

所有这些都假设文本转换不会发生(例如\n\r\n,反之亦然);如果情况如此,您必须将它们更改为以二进制模式打开文件。如果您不熟悉stdin,他们会从stdin中读取并写入stdout,所以只需使用programname < inputfile > outputfile来运行它们。

票数 8
EN

Stack Overflow用户

发布于 2009-12-31 07:46:18

通过一个简单的算术公式(假设您对无符号字节进行操作),可以反转上下半字节:

代码语言:javascript
复制
reversed = (original % 16) * 16 + (original / 16);
票数 2
EN

Stack Overflow用户

发布于 2009-12-31 08:16:04

Haskell解决方案:

代码语言:javascript
复制
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

代码语言:javascript
复制
runghc ReverseBytes.hs < inputfile > outputfile
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1984409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档