如何在C中将字符[2]转换为无符号短字符?

如何在C中将字符[2]转换为无符号短字符?,c,type-conversion,unsigned,C,Type Conversion,Unsigned,我在转换数据时遇到问题 我得到了一个特定的字符串(实际上只表示一些数据位(小尾端),而不是文本): 我想把它转换成这种类型: unsigned short numOfBlocks; 我一直在尝试以下代码,但它似乎打印垃圾,因为每次运行它时,我都会得到不同的“numoblocks”值输出(freeBlockSize由另一个函数提供给我,并且总是相同的): 提前感谢您的帮助。除了尾数问题之外,只需将保存char[]数组的内存重新解释为保存short: char freeBlockSize[2];

我在转换数据时遇到问题

我得到了一个特定的字符串(实际上只表示一些数据位(小尾端),而不是文本):

我想把它转换成这种类型:

unsigned short numOfBlocks;
我一直在尝试以下代码,但它似乎打印垃圾,因为每次运行它时,我都会得到不同的“numoblocks”值输出(freeBlockSize由另一个函数提供给我,并且总是相同的):


提前感谢您的帮助。

除了尾数问题之外,只需将保存
char[]
数组的内存重新解释为保存
short

char freeBlockSize[2];
unsigned short res;
// ..code..
res=*(unsigned short *)freeBlockSize;

顺便说一下,假设您正在使用某个函数并将
char[2]
作为结构中的字段传递,您可以将结构定义为将字段改为
unsigned short
(如果确实需要明确的2个字节,则可以将这两个字段合并)。这样可以避免额外的步骤。

除了尾数问题之外,它很简单,只需将包含
char[]
数组的内存重新解释为包含
short

char freeBlockSize[2];
unsigned short res;
// ..code..
res=*(unsigned short *)freeBlockSize;
顺便说一下,假设您正在使用某个函数并将
char[2]
作为结构中的字段传递,您可以将结构定义为将字段改为
unsigned short
(如果确实需要明确的2个字节,则可以将这两个字段合并)。这样可以避免额外的步骤。

使用:

  unsigned short numOFBlocks = *(unsigned short *)freeBlockSize;
但要小心:如果您在
freeBlockSize
中拥有的数据的Endianness与您的机器的Endianness相同,这将起作用,这可能是也可能不是,取决于存储在该向量中的数据源


更新:使用这种方法访问未对齐的指针存在一定的风险,因此这里有另一种解决此问题的方法:

unsigned short numOfBlocks = ((freeBlockSize[1] << 8) &0xFF00) | (freeBlockSize[0] & 0xFF);
unsigned short numoblocks=((freeBlockSize[1]使用:

但要小心:如果您在
freeBlockSize
中拥有的数据的Endianness与您的机器的Endianness相同,这将起作用,这可能是也可能不是,取决于存储在该向量中的数据源


更新:使用这种方法访问未对齐的指针存在一定的风险,因此这里有另一种解决此问题的方法:

unsigned short numOfBlocks = ((freeBlockSize[1] << 8) &0xFF00) | (freeBlockSize[0] & 0xFF);

unsigned short numoblocks=((freeBlockSize[1]如果您希望能够访问与不同值相同的内存,则可以使用
union

union short_bytes {
    unsigned short shorty;
    char bytes[2];
};
...
union short_bytes foo;

foo.shorty = (unsigned short)freeBlockSize;

printf("Test: %hhd %hhd\n", foo.bytes[0], foo.bytes[1]);
printf("Value: %hu\n", foo.shorty);

如果希望能够以不同的值访问相同的内存,则可以使用
联合

union short_bytes {
    unsigned short shorty;
    char bytes[2];
};
...
union short_bytes foo;

foo.shorty = (unsigned short)freeBlockSize;

printf("Test: %hhd %hhd\n", foo.bytes[0], foo.bytes[1]);
printf("Value: %hu\n", foo.shorty);

让编译器优化来处理细节

// OP says little endian.
#include <limits.h>
numOfBlocks = (unsigned char) freeBlockSize[1];
numOfBlocks <<= CHAR_BIT;  // thanks @Dietrich Epp 
numOfBlocks += (unsigned char) freeBlockSize[0];
//OP说的是小恩迪安。
#包括
numoblocks=(无符号字符)freeBlockSize[1];

numoblocks让编译器优化处理细节

// OP says little endian.
#include <limits.h>
numOfBlocks = (unsigned char) freeBlockSize[1];
numOfBlocks <<= CHAR_BIT;  // thanks @Dietrich Epp 
numOfBlocks += (unsigned char) freeBlockSize[0];
//OP说的是小恩迪安。
#包括
numoblocks=(无符号字符)freeBlockSize[1];

numOfBlocks在遇到类似问题后,我发现char是一种有符号类型。因此,要使用char类型作为数字,请将变量或数组声明为“unsigned char”
然后,当您将其强制转换为较长的类型(如unsigned short)时,它将正确地强制转换。

遇到类似问题后,我发现char是有符号类型。因此,要将char类型用作数字,请将变量或数组声明为“unsigned char”

然后,当您将其转换为较长的类型(如unsigned short)时,它将正确转换。

如果
freeBlockSize
short
没有正确对齐,这将在某些平台上崩溃。我相信您的意思是
freeBlockSize
而不是
&freeBlockSize
。对齐与此有什么关系?@Blindy应该
>freeBlockSize
阵列存在于奇数地址上,在不接受奇数地址上的
short
的系统上,此代码将出现seg/bus故障。比如..?请记住,我们是在2013年,16位保护内存模型热潮已经过去了几年。如果
freeBlockSize
没有正确对齐
shor,这将在某些平台上崩溃t
。我相信你的意思是
freeBlockSize
而不是
&freeBlockSize
。对齐与此有什么关系?@如果
freeBlockSize
数组存在于奇数地址上,在不接受奇数地址上的
short
的系统上,此代码将出现seg/bus故障。比如..?请记住,我们在2013年,几年后rs超过了16位保护内存模型的狂热。如果
freeBlockSize
没有正确对齐
short
,这将在某些平台上崩溃。这很好,谢谢。顺便说一句,我更新了这个问题,日期是以little-endian格式提交的,但它似乎转换得很好。有什么办法让我感到安全吗关于在不同计算机上运行的代码?这将不仅仅在我自己的计算机上运行。如果
freeBlockSize
对于
short
没有正确对齐,这将在某些平台上崩溃。这很好,谢谢。顺便说一句,我更新了这个问题,日期是以little-endian格式提交的,但它似乎转换得很好。是吗e有什么方法可以让我对运行在不同计算机上的代码感到安全吗?这不会只运行在我自己的计算机上。short是如何由“另一个函数”编码的?endian是有保证的,还是它的实现定义的?哦,它是little endian。我将更新这个问题。short是如何由“另一个函数”编码的?endian是保证的,还是定义了实现?哦,这是little endian。我会更新这个问题。