【问题标题】:How many bytes does it take to store a certain amount of Letters in base64 string在base64字符串中存储一定数量的字母需要多少字节
【发布时间】:2014-05-10 08:52:14
【问题描述】:

存储AAAAA 需要多少字节? 我知道一个 ASCII 字母占用一个字节,但是下面这行代码给了我一个奇怪的答案。

nbytesdecoded = ((ch + 3) / 4) * 3; Where ch is the length of characters, which is five.

上面的代码需要 6 个字节。是这样吗?

代码如下。

int nprbytes;

int nbytesdecoded;

char *s = new char[256]; 
char *bufin = new char[256]; 

cout << "Enter your phrase: ";
cin >> s;


bufin = (char *)s;
int ch = strlen(s);
ch = ch - 1;

nbytesdecoded = ((ch + 3) / 4) * 3;

cout << nbytesdecoded;

【问题讨论】:

  • 取决于格式。 ASCII 正确占用 7 位,GSM SMS 默认编码占用 7 位.... UTF-16 占用 16 位,UTF-8 占用可变数字。如果您执行 base64 或 uuencode 或其他一些 7 位清理,它们会占用超过一个字节... C 字符串您必须考虑空终止...。
  • 该公式应该代表什么?如果它确实是字节数,那么您大部分时间都会得到十进制答案。
  • 我试图理解我得到的这段代码。用于解码 Base64 字符串。
  • 请注明这是解码 base64 字符串所需的字节数。
  • UTF-16 需要 16 或 32 位.

标签: c++ ascii


【解决方案1】:

是的,如果您将AAAAA 作为字符串文字提供。这是因为每个字符串都有一个空终止字符 \0 后缀,这是一个额外的字节。

要获得 5 个字节的存储空间,您需要使用字符数组,而不是将其视为字符串

例如

char ch[5] = {'A', 'A', 'A', 'A', 'A'};

【讨论】:

  • 我将我的 char 声明为 char *s = (char*)malloc(256); s[0] = '\0';
  • 这只会将第一个字符设置为\0,这无助于分配带有strcpy等的字符串。
  • 好的。我知道了。我使用 strlen 并从 int 长度中减去一个。
  • strlen做什么?我需要查看更多代码来告诉您您的代码是否正确:P
  • 另外,你应该在 c++ 中使用new,而不是malloc
【解决方案2】:

Base64 表示输出文本中的每个字符都对输入数据的 6 位(64 种可能的组合)进行编码。假设您的字符串被编码为每个字符一个八位字节,这意味着五个字符占用 40 位。除以 6 并四舍五入,得到 7。

顺便说一句:Base64 非常普遍,您可以使用现有的任何编程语言实现并自己测试。另外,你误读了代码,因为数字是nbytesdecoded,这表明它是解码Base64字符串后的数字,但即使这样仍然是错误的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-04
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 2012-06-01
    相关资源
    最近更新 更多