在C中将十六进制转换为二进制

时间:2018-10-19 13:44:39

标签: c binary

我目前正在维护从以前的开发人员那里继承的代码。 我必须了解一个将ID从十六进制转换为Binay的函数。我不能完全理解他背后的逻辑。下面是代码,

int iHex2Bin(char * pchIn, char * pchOut, int iLen)
{
int i;

memset(pchOut, 0, iLen);

for(i=0; i<iLen; i++)
{
    pchOut[i] = (((unsigned char) *pchIn)-0x30)*16;
    pchIn++;
    pchOut[i] += (((unsigned char) *pchIn)-0x30);

    pchIn++;
}
return(0);
}

顾名思义,它将十六进制转换为Bin。我不理解该功能的逻辑。有人可以解释吗?谢谢。

感谢您的回答。现在有点清楚了。我还添加了相反的功能以进行更多分类,

int iBin2Hex(char * pchIn,char * pchOut,int iLen) {     int i;

unsigned char chInBuff[256]={0};
char chOutBuff[513]={0};
char chTemp[3]={0};

if(iLen>256)
    return(-2);

memcpy(chInBuff, pchIn, iLen);
for(i=0; i<iLen; i++)
{
    sprintf(chTemp, "%02X", chInBuff[i]);
    strcat(chOutBuff, chTemp);
}

memcpy(pchOut, chOutBuff, iLen*2 + 1);
return(SUCCESS);

}

我认为此功能是必需的,并且该功能的名称非常混乱。可以使用C库函数。但是代码可以正常唤醒,因此我没有做任何更改。如果将来需要,我只需要了解代码即可。

3 个答案:

答案 0 :(得分:3)

我认为该功能不完全符合您的要求。它需要一个字符串作为输入,并生成另一个字符串作为输出,但是我会犹豫是否将输入标记为“十六进制”。输出是包含二进制值的带符号字节序列。

让我们看一下代码的核心:表达式(((unsigned char) *pchIn)-0x30)。这将读取单个字符并减去0x30的ASCII值'0'。因此,此表达式正确地将ASCII数字转换为0到9之间的值。它不能正确处理任何其他字符。具体来说,它将为字符'A''F''a''f'生成正确的值10-15。输入字符串中的替代字符要乘以16的事实……不,这不足以使这个十六进制成为一个数字。

基本上,它正在做的是(假定长度是偶数)字节字符串 A,B,C,D,...并将其转换为字节串A * 16 + B,C * 16 + D,...

使用标准库函数之一将字符串转换为实际的二进制值(例如,int)要好得多,这很容易检查,打印等。 。然后将该二进制值转换为其他格式的字符串。请查阅任何手册或在线文档。我相信strtolltoa将满足您的需求。

答案 1 :(得分:2)

如果函数内的代码正确,则函数名称错误。它看起来确实很业余,但是可以想象它旨在读取ASCII数字序列(无论C实现的执行字符集是什么)并写入binary-coded decimal

例如,此例程可以用来读取ASCII文本,并准备将其准备用于使用二进制编码的十进制的财务软件。 (如今,不使用ASCII的系统已经很少见,使用二进制编码的十进制的系统或应用程序也很不常见,但是代码同时显示了这两者的迹象表明这是有意而非偶然的证据。)

考虑到这一点,我们可以解释代码:

    <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>cricket</groupId>
    <artifactId>CricketFX</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.openjfx/javafx -->
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-media</artifactId>
            <version>11</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.openjfx/javafx -->
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>11-ea+25</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.openjfx/javafx -->
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-swing</artifactId>
            <version>11-ea+19</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.0.0</version>
        </dependency>

        <!-- for timezones -->
        <dependency>
            <groupId>com.google.maps</groupId>
            <artifactId>google-maps-services</artifactId>
            <version>0.2.6</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-math3 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-math3</artifactId>
            <version>3.6.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.hsqldb/hsqldb -->
        <dependency>
            <groupId>org.hsqldb</groupId>
            <artifactId>hsqldb</artifactId>
            <version>2.4.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.11.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.json/json -->
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20171018</version>
        </dependency>
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.7</version>
        </dependency>

        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.0</version>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>18.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.6.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.6.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpcore</artifactId>
            <version>4.4.4</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpasyncclient</artifactId>
            <version>4.1.3</version>
        </dependency>


        <dependency>
            <groupId>io.reactivex</groupId>
            <artifactId>rxjava</artifactId>
            <version>1.2.9</version>
        </dependency>
        <dependency>
            <groupId>com.netflix.rxjava</groupId>
            <artifactId>rxjava-apache-http</artifactId>
            <version>0.20.7</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.madgag/animated-gif-lib -->
        <dependency>
            <groupId>com.madgag</groupId>
            <artifactId>animated-gif-lib</artifactId>
            <version>1.4</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.jcodec/jcodec -->
        <dependency>
            <groupId>org.jcodec</groupId>
            <artifactId>jcodec</artifactId>
            <version>0.2.3</version>
        </dependency>
        <dependency>
            <groupId>org.jcodec</groupId>
            <artifactId>jcodec-javase</artifactId>
            <version>0.2.2</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <release>11</release>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.6.0</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>java</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <mainClass>application.gui.AppStarter</mainClass>
                </configuration>
            </plugin>

        </plugins>
    </build>


</project>

这对每对输出数字重复一次。因此处理的位数为for(i=0; i<iLen; i++) ,写入的字节数为2*iLen

iLen

这从输入中获取一个字符,并减去ASCII码“ 0”。由于ASCII数字“ 0”到“ 9”具有连续的代码,因此结果是由数字表示的数字0到9。然后将该数字乘以16,实际上是左移,并存储在当前输出字节中。

    pchOut[i] = (((unsigned char) *pchIn)-0x30)*16;

这将计算下一个输入字符表示的数字,并将其添加到当前输出字节。结果是将两个数字打包在一个字节中,每个字节用四位编码。例如,输入中的十进制数字“ 74”将被编码为74 16 pchOut[i] += (((unsigned char) *pchIn)-0x30); ),即116 10

答案 2 :(得分:0)

除了别人所说的错误之外,代码还可以使用以下代码将连续的十六进制字符对转换为一个字节

// inside the loop
pchOut[i] = strtoul((char[3]){pchIn[0], pchIn[1]}, 0,16);
pchIn += 2;

这使用自C99以来可用的直义字面量。