我在TCP套接字服务器和放大器之间发送字节数组。 C中的客户端。我发送的信息是一系列整数。
我有它工作,但因为我不太熟悉C,我想知道是否有人可以建议一个更好的解决方案,或者至少看看并告诉我,我不是太疯狂或使用过时的代码我在做什么
首先,我生成一个随机十进制值,假设为“350”。我需要通过套接字连接作为十六进制字节数组传输。它在另一端被解码回其十进制值。
到目前为止,我用这种方式将其转换为hex:
unsigned char hexstr[4];
sprintf(hexstr, "%02X", numToConvert); \\ where numToConvert is a decimal integer value like 350
此时,我在hexstr中有一个字符串,类似于“15E”(再次,使用十六进制值350作为示例)。
现在,我需要将它存储在一个字节数组中,使其看起来像:myArray = {0X00,0X00,0X01,0X5E};
显然我不能写:myArray = {0X00,0X00,0X01,0X5E},因为每次都会有不同的值,因为每次都会产生一个新的随机数。
目前,我这样做(伪代码因为字符串操作部分不相关但很长):
lastTwoChars = getLastTwoCharsFromString(hexstr); // so lastTwoChars would now contain "5E"
然后(实际代码):
sscanf(lastTwoChars, "%0X", &res); // now the variable res contains the byte representation of lastTwoChars, is my understanding
最后:
myArray[3] = res;
然后,我从hexstr中取下两个最右边的字符(再次,使用“15E”的样本值,这将是“01” - 如果只有1个字符,在这种情况下“1”是从“15E”中取出“5E”之后只剩下一个字符,我在左侧添加0来填充)并使用sscanf以相同方式转换,然后插入myArray [2]。重复myArray [1]和myArray [0]。
然后我使用write()发送数组。
所以,经过几个小时的封锁后,这一切都有效......但由于我不太使用C,我有一种唠叨的怀疑,这就是我所缺少的东西。任何人都可以发表评论,如果我正在做的事似乎没问题,或者有什么显而易见的我使用不当或忽视使用?
答案 0 :(得分:1)
#include <stdio.h>
#include <limits.h>
int main(){
unsigned num = 0x15E;//num=350
int i, size = sizeof(unsigned);
unsigned char myArray[size];
for(i=size-1;i>=0;--i, num>>=CHAR_BIT){
myArray[i] = num & 0xFF;
}
for(i=0;i<size;++i){
printf("0X%02hhX ", myArray[i]);//0X02X
}
printf("\n");
return 0;
}
答案 1 :(得分:1)
在发送端,使用此代码将32位数转换为四字节数组
void ConvertValueToArray( uint32_t value, uint8_t array[] )
{
int i;
for ( i = 3; i >= 0; i-- )
{
array[i] = value & 0xff;
value >>= 8;
}
}
在接收端,使用此代码将字节数组转换回数字
uint32_t ConvertArrayToValue( uint8_t array[] )
{
int i;
uint32_t value = 0;
for ( i = 0; i < 4; i++ )
{
value <<= 8;
value |= array[i];
}
return( value );
}
请注意,在编写此类代码时使用int
等通用类型非常重要 ,因为int
在不同系统上的大小可能不同。固定大小的类型在<stdint.h>
中定义。
这是一个简单的测试,用于演示转换(不通过网络实际发送字节数组)。
#include <stdio.h>
#include <stdint.h>
int main( void )
{
uint32_t input, output;
uint8_t byte_array[4];
input = 350;
ConvertValueToArray( input, byte_array );
output = ConvertArrayToValue( byte_array );
printf( "%u\n", output );
}
答案 2 :(得分:0)
如果您的阵列是4字节对齐的(即使它不支持未对齐访问的机器上),您也可以使用htonl
函数将32位整数从主机转换为网络字节顺序并立即存储整个事物:
#include <arpa/inet.h> // or <netinet/in.h>
...
*(uint32_t*)myArray = htonl(num);