将包含非ASCII字符的字节数组转换为字符串

时间:2014-03-21 10:49:49

标签: c++

我想转换一个字节数组(包含64个元素),如下所示:

9b b4 f5 b0 67 3c f8 e1 f1 f8 02 8c b2 13 4d 66 f0 72 a0 05 ...

到一个字符串。像“9bb4f5b067 .....”这样的东西。本质上我想将这个字节数组写入CFile,我意识到最简单的方法是将字节数组转换为字符串,然后编写内容。每当我尝试将数组转换为字符串时,我会得到一些特殊字符,当我尝试将字节数组直接写入文件时,我会看到文件中写入的特殊字符。有什么建议吗?

以下是代码:pbSignature类型为PBYTE,打印方式如下:

printf("The signature is:  ");
for (DWORD i = 0 ; i < cbSignature ; i++) 
{
    printf("%2.2x ",pbSignature[i]);
}

// Imprint the signature to the CRC file
if (!file.Open(crcFilePath, CFile::modeWrite, NULL))
{
    printf("File could not be opened %d\n");
    goto Cleanup;
}

for (DWORD i = 0 ; i < cbSignature ; i++) 
{           
    //printf("size of pbsig is %d and value of pbsig is %d\n",sizeof(pbSignature[i]),pbSignature[i] );
    file.Write(&pbSignature[i],sizeof(pbSignature[i]));
    //printf("%2.2x ",pbSignature[i]);
}

3 个答案:

答案 0 :(得分:2)

您可以直接将字节数组内容作为原始字节序列写入二进制文件 您可以使用CFile::Write()方法,例如

// 'file' is an instance of CFile, and is already opened for writing
file.Write(yourBufferPointer, yourBufferSize);

如果要将字节数组的内容写为十六进制数字序列(将文件视为 text 文件),您可以简单地定义一个辅助函数来转换{{1转换为包含字节十六进制表示的字符串。然后,您可以遍历输入数组,将每个字节转换为十六进制字符串,并将字符串内容打印到文件中。

这是一个这样的转换函数的例子,在控制台中打印十六进制字节序列:

BYTE

在控制台中编译并运行测试:

#include <stdio.h>      // For sprintf_s()
#include <iostream>     // For console output
#include <string>       // For std::string
#include <Windows.h>    // For Win32 Platform SDK (for BYTE definition)
using namespace std;

string byteToHexString(BYTE b) {
    char hexBuf[3]; // One byte in hex is 2 digits, plus NUL string terminator.
    sprintf_s(hexBuf, "%02X", b);
    return hexBuf;
}

int main() {
    BYTE buffer[] = {0x11, 0x22, 0x33, 0xAA, 0xBB, 0xFF};

    for (size_t i = 0; i < sizeof(buffer); ++i) {
        cout << byteToHexString(buffer[i]) << ' ';
    }
    cout << endl;
}

如果你想一次将整个二进制数组转换成一个字符串,你可以定义一个这样的函数(请注意,如果二进制文件很大,这不是很好;在这种情况下,它会更好遵循先前的convert-single-bytes-and-write-each-byte-to-file方法):

C:\Temp\CppTests>cl /EHsc /W4 /nologo test.cpp
test.cpp

C:\Temp\CppTests>test.exe
11 22 33 AA BB FF

答案 1 :(得分:1)

你可能想要这个:

unsigned char bytes[] = {0x9b, 0xb4, 0xf5, 0xb0 } ;   // your array of bytes
string st ;
for (int i = 0; i < sizeof(bytes)/sizeof(bytes[0]); i++)
{
   char buff[4];
   sprintf(buff, "%02x", (unsigned char)bytes[i]) ;
   st = st + buff ;
}
// now st contains "9bb4f5b0"

答案 2 :(得分:0)

将您的字节数组转换为base64字符串,这将使其可读:

C++ Base64 Implementation