将字符数组转换为ASCII键值的快速方法

时间:2016-03-01 01:06:25

标签: c++ arrays ascii

我正在创建一个程序,它从一个由a-z和数字0组成的文件中读取序列中的大量字符。示例如下所示:

a0dgiw00cffn0ai0cbiwa0...

我相信我将此序列转换为字符数组:

strncpy(array, string.c_str(), sizeof(array));

现在我有一个看起来像这样的数组:

[a][0][d][g][i][w][0][0]...

所以我的问题是,将字符数组中的所有值转换为ASCII键值的最有效方法是什么?尽可能在最短的时间内效率最高。如果您不理解“ASCII键值”的含义,最终数组应如下所示:

[97][48][100][103][105][119][48][48]...

旁注:可以找到一个ASCII键值表here

Side注意:我已经知道如何将数组值转换为ASCII,我只是在寻找一种更快的方法。

提前谢谢。

2 个答案:

答案 0 :(得分:2)

假设有很多关于您的语言环境的内容,它已经存储为ASCII字符"在引擎盖下",如在' a' == 97二进制文件中char(或编译器/系统使用的任何内容)。让你的系统对待' a'作为整数值而不是字符,您只需要(int)'a',字符串的任何部分都需要(int)array[index]

#include <iostream>
#include <string>

int main() {
    using namespace std;
    string sample = "abcdefghijklmnopqrstuvwxyz";
    for(char c : sample) {
        // NOTE: cast to (int) doesn't change value of 'c'.
        cout << c << '=' << (int)c << endl;
    }
    return 0;
}

输出:

a=97
b=98
c=99
d=100
e=101
f=102
g=103
h=104
i=105
j=106
k=107
l=108
m=109
n=110
o=111
p=112
q=113
r=114
s=115
t=116
u=117
v=118
w=119
x=120
y=121
z=122

答案 1 :(得分:0)

对于初学者来说,如果你正在寻找效率,那么数组的初始strncpy()绝对没有任何结果。我不知道它给你带来了什么。 string.c_str()为您提供与数组相同的const char *。保持一切就绪,避免不必要的复制开销。

然后,如果您正在寻找将char值转换为十进制的最有效方法,那么手动操作将很难被击败。

unsigned char c=  /* wherever you get the next char from */

int zero=0;

if (c >= 100)
{
    zero=1;
    *ptr++ = (c/100) + '0';

    c = c % 100;
}

if (c >= 10 || zero)
{
    *ptr++ = (c / 10) + '0';
}

*ptr++ = (c % 10) + '0';

这应该轻松击败std::ostream所做的事情,因为它不必担心std::ostream输出格式必须要做的所有行李。

现在,如果原始string长度为n=size()个字节,则转换为十进制表示的整个事物的最长可能大小为每个值三个字符,或n*3。然后,考虑到括号,它是另外两个,总计为n*5

所以:

 std::vector<char> output_buffer;

 output_buffer.resize(string.size()*5);

 auto ptr=&output_buffer[0];

 for (unsigned char c:string)
 {
       // the code segment above, with a few extra bits to append
       // the [ and the ], in the right place.
 }

完成后,ptr-&output_buffer[0]会为您提供实际写入的字符数。您可以修剪缓冲区,或将其复制到您自己的std::string中。