C++ C代码与C++;关于查找

C++ C代码与C++;关于查找,c++,c,C++,C,我有以下代码块(不是我写的),它执行映射并将ASCII字符重新编码到EBCDIC // Variables. CodeHeader* tchpLoc = {}; ... memset(tchpLoc->m_ucpEBCDCMap, 0xff, 256); for (i = 0; i < 256; i++) { if (tchpLoc->m_ucpASCIIMap[i] != 0xff) { ucTmp2 = i; asc2ebn(&

我有以下代码块(不是我写的),它执行映射并将ASCII字符重新编码到EBCDIC

// Variables.
CodeHeader* tchpLoc = {};
...
memset(tchpLoc->m_ucpEBCDCMap, 0xff, 256);
for (i = 0; i < 256; i++) {
    if (tchpLoc->m_ucpASCIIMap[i] != 0xff) {
        ucTmp2 = i;
        asc2ebn(&ucTmp1, &ucTmp2, 1);
        tchpLoc->m_ucpEBCDCMap[ucTmp1] = tchpLoc->m_ucpASCIIMap[i];
    }
}
似乎给我带来问题的方法是

void asc2ebn(char* szTo, char* szFrom, int nChrs)
{
    while (nChrs--)
        *szTo++ = ucpAtoe[(*szFrom++) & 0xff];
}
[注意,
unsigned char
array
ucpAtoe[256]
复制在问题末尾,以供参考]

现在,我有一个旧的C应用程序和我的C++11转换并排运行,这两个代码编写了一个巨大的.bin文件,并且有一个微小的差异,我已经追踪到上面的代码。这两种代码的情况都是块

...
    if (tchpLoc->m_ucpASCIIMap[i] != 0xff) {
        ucTmp2 = i;
        asc2ebn(&ucTmp1, &ucTmp2, 1);
        tchpLoc->m_ucpEBCDCMap[ucTmp1] = tchpLoc->m_ucpASCIIMap[i];
    }
<> >输入<代码> i=32 < /代码>和<代码> ASC2EBN 方法返回代码> > UCTMP1 < /代码>为代码> 64 < /代码>或<代码> @ @ /COD> C和C++变体均为大。下一个条目是针对<代码> i=48 < /代码>,对于该值,<代码> ASC2EBN 方法返回<代码> UCTMP1 < /代码>为<代码> 240 < /代码>或<代码> > <代码>,C++代码返回<代码> UTMP1 < /代码>为<代码> -16 < /代码>或<代码> > <代码>。我的问题是,为什么这种查找/转换会为完全相同的输入和查找数组(复制如下)产生不同的结果

在这种情况下,旧C代码被认为是正确的,所以我希望C++为这个查找/转换产生相同的结果。谢谢你抽出时间



在C++和C++中,标准不要求<代码> char <代码>为<代码>签名或<代码>未签名< /C> >类型。它是实现的定义,显然,你的C编译器决定了<代码> char <代码>是代码>未签名char < />代码,而你的C++编译器则决定它是代码>符号char < /c> > /p>
对于GCC,使
char
成为
unsigned char
的标志是
-funsigned char
。对于MSVC,它是
/J

240
-16
char
的相同值,不是吗?您是否尝试过明确使用
无符号char
而不是
char
。。。因为
char
可以是无符号的,也可以是有符号的。
asc2ebn()
看起来根本不返回任何东西-它声明为
void asc2ebn(…)
@twalberg,我正在传递一个引用
&ucTmp1
,它正在被更改并返回给我。@Joker\vD不,它们是不同的。这是索引指针,而不是数组值。。。谢谢你抽出时间。但是这会不会迫使所有的
char
值变成
无符号的
?如果是这样,这不是我想要的,因为代码
char
中的其他地方故意使用了值。。。对于C++版本,我尝试使用这个标志(<代码> \j/COD>),这对转换没有帮助。我将重写转换方法
asc2ebn
,也许会对其进行模板化…@Killercam:您不需要模板化任何内容,只需访问
szTo
szFrom
转换为
无符号字符*
,或者让您的
asc2ebn
函数接受
无符号字符*
。这就是为什么有三种不同类型的字符,
char
signed char
unsigned char
。这并没有解决问题,但让我直接走上了正确的道路,谢谢。最后,我重载了该方法,以获取
unsigned char*
char*
。原因是在代码的其他地方,采用了
char*
,并使用了负索引(!?)-我将不得不对此进行研究。。。谢谢大家的帮助。@killercam:您应该只对C样式的字符串和C样式的字符常量使用char。所以
char*output=“Hello World”很好。当按值使用字符时,需要有符号字符或无符号字符,而不是普通字符。纯字符让您任由编译器默认设置great建议支配。谢谢我对C++非常陌生,每天都在学习。再次感谢。
...
    if (tchpLoc->m_ucpASCIIMap[i] != 0xff) {
        ucTmp2 = i;
        asc2ebn(&ucTmp1, &ucTmp2, 1);
        tchpLoc->m_ucpEBCDCMap[ucTmp1] = tchpLoc->m_ucpASCIIMap[i];
    }
static UCHAR ucpAtoe[256] = {
    '\x00','\x01','\x02','\x03','\x37','\x2d','\x2e','\x2f',/*00-07*/
    '\x16','\x05','\x25','\x0b','\x0c','\x0d','\x0e','\x0f',/*08-0f*/
    '\x10','\x11','\x12','\xff','\x3c','\x3d','\x32','\xff',/*10-17*/
    '\x18','\x19','\x3f','\x27','\x22','\x1d','\x35','\x1f',/*18-1f*/
    '\x40','\x5a','\x7f','\x7b','\x5b','\x6c','\x50','\xca',/*20-27*/
    '\x4d','\x5d','\x5c','\x4e','\x6b','\x60','\x4b','\x61',/*28-2f*/
    '\xf0','\xf1','\xf2','\xf3','\xf4','\xf5','\xf6','\xf7',/*30-37*/
    '\xf8','\xf9','\x7a','\x5e','\x4c','\x7e','\x6e','\x6f',/*38-3f*/
    '\x7c','\xc1','\xc2','\xc3','\xc4','\xc5','\xc6','\xc7',/*40-47*/
    '\xc8','\xc9','\xd1','\xd2','\xd3','\xd4','\xd5','\xd6',/*48-4f*/
    '\xd7','\xd8','\xd9','\xe2','\xe3','\xe4','\xe5','\xe6',/*50-57*/
    '\xe7','\xe8','\xe9','\xad','\xe0','\xbd','\xff','\x6d',/*58-5f*/
    '\x79','\x81','\x82','\x83','\x84','\x85','\x86','\x87',/*60-67*/
    '\x88','\x89','\x91','\x92','\x93','\x94','\x95','\x96',/*68-6f*/
    '\x97','\x98','\x99','\xa2','\xa3','\xa4','\xa5','\xa6',/*70-77*/
    '\xa7','\xa8','\xa9','\xc0','\x6a','\xd0','\xa1','\xff',/*78-7f*/
    '\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff',/*80-87*/
    '\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff',/*88-8f*/
    '\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff',/*90-97*/
    '\xff','\xff','\xff','\x4a','\xff','\xff','\xff','\xff',/*98-9f*/
    '\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff',/*a0-a7*/
    '\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff',/*a8-af*/
    '\xff','\xff','\xff','\x4f','\xff','\xff','\xff','\xff',/*b0-b7*/
    '\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff',/*b8-bf*/
    '\xff','\xff','\xff','\xff','\xff','\x8f','\xff','\xff',/*c0-c7*/
    '\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff',/*c8-cf*/
    '\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff',/*d0-d7*/
    '\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff',/*d8-df*/
    '\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff',/*e0-e7*/
    '\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff',/*e8-ef*/
    '\xff','\xff','\xff','\x8c','\xff','\xff','\xff','\xff',/*f0-f7*/
    '\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff' };