1

bin2hex($s)GCC/Linux C++ で PHPとpack('H*',$s)(別名PHP 5.4.3+)を複製しようとしhex2bin($s)ているときに、何らかの奇妙な理由で句読点が削除されていることを除いて、私はそれを理解しているようです。hex2bin() 関数で何が間違っているのか分かりますか? PHP の bin2hex() を私のものと比較したところ、適切に動作しているように見えたので、問題は hex2bin() にあります。

#include <strings.h>
#include <string>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

string bin2hex(string s) {
  int nLen = s.length();
  string sOut;
  char cBuff[2];
  for (int i = 0; i < nLen; i++) {
    sprintf(cBuff,"%.2x",s[i]);
    sOut.append(cBuff);
    cBuff[0] = '\0';
  }
  return sOut;
}

string hex2bin(string s) {
  int nLen = s.length();
  string sOut;
  char cBuff1[2];
  char cBuff2[2];
  char cBuff[1];
  int n,n1,n2;
  for (int i = 0; i <= nLen; i+=2) {
    sprintf(cBuff1,"%c",s[i]);
    sprintf(cBuff2,"%c",s[i+1]);
    n1 = atoi(cBuff1);
    n2 = atoi(cBuff2);
    n = (n1 * 16) + n2;
    sprintf(cBuff,"%c",n);
    sOut.append(cBuff);
    cBuff[0] = '\0';
    cBuff1[0] = '\0';
    cBuff2[0] = '\0';
  }
  return sOut;
}

int main() {
  string s;
  string sResult;  
  s = "This is a 123 test.";
  sResult = bin2hex(s);
  printf("ENCODED: %s\n",sResult.c_str());
  sResult = hex2bin(sResult);
  printf("UNENCODED: %s\n",sResult.c_str());
  return 1;
}

これは以下を発行します:

ENCODED: 5468697320697320612031323320746573742e
UNENCODED: This is a 123 test
4

5 に答える 5

3

ピリオド以外はすべて'.'幸運でした。16 進数は実際の 16 進数値を使用していませんでした。ただし、取得した期間については、を使用2eしてデコードしようとしましたが、大まかに: 10 進数値が必要なため、これは機能しません。代わりに、16 進数値をデコードするために使用できます。eatoi("e")atoi()strtol(str, 0, 16)

を使用している場合、いくつかのバッファ オーバーランが発生することに注意してくださいsprintf()。この関数は、終端のヌル文字を書き込みます。snprintf()一般に、バッファ オーバーランを回避する方がはるかに適しています。また、デコード ルーチンでは、文字列の末尾を超えた値にアクセスします ( with を使用i <= nLenしてnLen = s.length()から and にアクセスs[i]しますs[i+1])。もちろん、コードは非常に複雑です。

#include <string>
#include <sstream>
#include <iostream>
#include <iomanip>

std::string bin2hex(std::string s) {
    std::ostringstream out;
    out << std::hex << std::setfill('0');
    for (char c: s) {
        out << std::setw(2) << int(c);
    }
    return out.str();
}

std::string hex2bin(std::string s) {
    std::string rc;
    int nLen = s.length();
    int tmp;
    for (int i(0); i + 1 < nLen; i += 2) {
        if (std::istringstream(s.substr(i, 2)) >> std::hex >> tmp) {
            rc.push_back(tmp);
        }
    }
    return rc;
}

int main() {
  std::string s;
  std::string sResult;  
  s = "This is a 123 test.";
  sResult = bin2hex(s);
  std::cout << "ENCRYPTED: " << sResult << '\n';
  sResult = hex2bin(sResult);
  std::cout << "UNENCRYPTED: " << sResult << '\n';
  return 1;
}
于 2013-09-19T23:16:24.530 に答える